Форум программистов, компьютерный форум CyberForum.ru

вектор алгоритм erase - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 00:25     вектор алгоритм erase #1
Доброго всем времени суток.Пожалуйста подскажите чайнику.Пытаюсь из контейнера убрать лишние данные с помощью erase ,но ничего не получается.Пишет,что erase не объявлен.Что нужно еще подключать не знаю.У меня стоит code::dlock 10-05,возможно что то и не установлено.Пожалуйста подскажите кто сможет.
вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
#include <assert.h>
 
using namespace std;
 
int main()
{
int ia[] = { 0, 1, 0, 0, 0, 0, 0, 4, 0, 0 };
   vector< int > vec( ia, ia+10 );
   vector<int>::iterator it = vec.begin(), end_it = vec.end();
     SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
   cout << "Начальный массив: ";
   for ( ; it != end_it;  it++ ) cout << *it << ' ';
   cout << "\n\n";
 
   cout <<"последовательность не изменяется: нули не стоят рядом"<<"\n";
   unique( vec.begin(), vec.end() );
   it = vec.begin(); end_it = vec.end();
     for ( ; it != end_it; ++ it ) cout << *it << ' ';
      cout << "\n\n";
 
   // сортировка массива
   sort( vec.begin(), vec.end() );
 
   cout << "упорядоченный массив: ";
   it = vec.begin(); end_it = vec.end();
   for ( ; it != end_it; ++ it ) cout << *it << ' ';
      cout << "\n\n";
 
   cout <<"последовательность изменяется: нули  стоят рядом"<<"\n";
   unique( vec.begin(), vec.end() );
   it = vec.begin(); end_it = vec.end();
     for ( ; it != end_it; ++ it ) cout << *it << ' ';
      cout << "\n\n";
      // удалить из контейнера ненужные элементы
   cout << "удалить из контейнера ненужные элементы "<<"\n";
 
    erase( vec.begin(), vec.end() );
     it = vec.begin(); end_it = vec.end();
     for ( ; it != end_it; ++ it ) cout << *it << ' ';
      cout << "\n\n";
 
      return 0;
}
Все работает кроме удаления.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 00:25     вектор алгоритм erase
Посмотрите здесь:

C++ vector.erase
.erase() в массиве. C++
C++ Двумерынй вектор, удаление через erase
C++ vector::erase()?
std::vector::erase C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
16.03.2013, 04:00     вектор алгоритм erase #21
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хочу заметить что учить английский также трудно/легко, как и сами плюсы.
если в школе не прогуливать - не сложно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.03.2013, 04:01     вектор алгоритм erase #22
Цитата Сообщение от MrGluck Посмотреть сообщение
если в школе не прогуливать - не сложно.

Не по теме:

Хочу назад в школу и не прогуливать

Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
17.03.2013, 01:43  [ТС]     вектор алгоритм erase #23
Только школу прогуливал лет этак 40 тому назад,а может и больше.Оставим это в покое.Трудно подсказать не надо.Только в то время мы не отставали и даже где то были впереди.Вот вам и карты в руки.Не прогуливайте чтобы сногва пойти вперед,а не назад как в последние годы.Извините.

Добавлено через 15 минут
PS кто не хочет учиться ищет причины,кто хочет- способы.

Добавлено через 12 часов 2 минуты
MrGluck еще раз огромное спасибо!К сожалению последнее ваше сообщение не удалось прочитать,а может и к лучшему ,со всеми своими вопросами разобрался кроме последнего.Но сейчас вроде скорость поднялась буду разбираться дальше.У меня интернет, без слез работать не возможно скорость 0-200кбит.Вот что у меня получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//удалить равные значения
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
#include <iomanip>
#include <iterator>
 
 
void printV (double);
 
using namespace std;
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 double ia[] = { 0.5,1.1,-2.2,0.5,1.1,4.2,0.5,4.4,2.2,-3.05,
              5.5,1.1,4.2,3.3,-0.05,5.4,1.1,2.2,4.4,2,7.7,1.1 };
 
 vector<double> vec( ia, ia + sizeof(ia)/sizeof(*ia) );
 cout << "Начальный массив: " << "\n";
 copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
 cout << "\n\n";
 
        // удалить из контейнера не нужные элементы
 
  cout << "Полученный массив : "<<"\n";
  sort( vec.begin(), vec.end() );
  vector<double>::iterator uit = unique( vec.begin(), vec.end() );
  vec.erase( uit, vec.end() );
  copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
  cout << "\n\n";
 
return 0;
}
Я так понял,что с такой строкой
C++
1
copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
вывод с модификаторами setw и setprecision() не получится? В функцию вставить тоже не получилось.Так что поработать есть над чем.
Еще раз огромное спасибо.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
17.03.2013, 02:26     вектор алгоритм erase #24
Цитата Сообщение от Genn55 Посмотреть сообщение
Я так понял,что с такой строкой
C++
1
copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
вывод с модификаторами setw и setprecision() не получится?
Отчего же это?
C++
1
copy(vec.begin(), vec.end(), ostream_iterator<double>(cout << setw(5) << setprecision(2), ", ") );
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
17.03.2013, 02:55  [ТС]     вектор алгоритм erase #25
А у меня почему то не получилось,написал так же.Наверное все же была какая то ошибка.Уже не сравню-удалил.
Читаю про лямбда-функцию,если я правильно понял,переменной присваивается функция т.е это фактически переменная.У вас написано auto перед названием функции,но если она ничего не передает это же void ?А почему auto ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
17.03.2013, 03:08     вектор алгоритм erase #26
Genn55, это как бы анонимная функция, функция без названия. Но грубо говоря так.
auto - ключевое слово, позволяющее создать переменную типа инициализирующего значения, т.е. идентификатор типа определяется компилятором самостоятельно, в нашем случае это лямбда-функция. Тем не менее, сама по себе она не имеет названия.

Почитайте также про ключевое слово auto, если действительно интересно, но вообще то это уже необязательные надстройки, вам желательно сначала полностью понять как устроен код без них.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 22:12     вектор алгоритм erase
Еще ссылки по теме:

C++ Алгоритм решения. Записать в вектор индексы элементов от максимального к минимальному
C++ Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с произвольным кол-во элементов.
Шаблон класса вектор с операциями индексации и функциями insert и erase C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
22.03.2013, 22:12  [ТС]     вектор алгоритм erase #27
Добрый вечер!Если можно,еще вопрос.Вот моя программка бессмысленная,с помощью erase очищаю вектор интервалами.Все что смог придумать все работает это фрагмент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <iomanip>
#include <math.h>
#include <iterator>
#include <vector>
#include <algorithm>
#include <windows.h>
#include <numeric>
 
using namespace std;
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 const int size = 30;//объявляем статический массив на 30 элементов
   //и инициализируем или заполняем и сортируем
 double  A[size] ={0.25,0.28,0.3,0.315,0.335,0.355,0.38,0.4,0.45,0.5,0.53,0.56,0.6,0.63,
                 0.67,0.71,0.75,0.8,0.85,0.9,0.95,1.0,1.06,1.12,1.18,1.25,1.32,1.40,1.45,1.5};
 
 vector<double> vec( A, A + sizeof(A)/sizeof(*A) );
  double D;
  D = 1;
  cout << "Начальный массив: " << "\n\n";
  copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
  cout << "\n\n";
 //перезаписываем массив в интервале от 0.55 до 1.25
  vec.erase ( vec.begin(), vec.end() );
 for (int i = 0; i < size; i++)
     if(A[i] >= D*0.55 && A[i]<=D*1.25)
         vec.push_back (A[i]);//2)*(A[i]/2))*pi);
         cout << "Перезаполненный массив: " << "\n\n";
         copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
         cout << "\n\n";
//очистить массив от лишних элементов оставляем интервал от 0.71 до 1.12
//происходит смещение на 1 элемент влево от заданного
  cout << "Очищенный массив : "<<"\n\n";
 vector<double>::iterator dmin, dmax;
 double nmin ,nmax;
  nmax = 0.71;
  nmin = 1.12;
  dmax = find( vec.begin(), vec.end(), nmax);
  vec.erase(vec.begin(),dmax );
  dmin = find( vec. begin(), vec.end(), nmin);
  vec.erase(dmin,vec.end() );
  copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
  cout << "\n\n";
  //удаление интервала удаляется интервал от 0.8 до 1
    cout << " Массив с удаленным интервалом : "<<"\n\n";
 vector<double>::iterator dmin1, dmax1;
 double nmin1 ,nmax1;
 nmin1 = 0.8;
 nmax1 = 1;
    dmin1 = find( vec. begin(), vec.end(), 0.8);
    dmax1 = find( vec.begin(), vec.end(), 1);
    vec.erase(dmin1,dmax1 );
    copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
    cout << "\n\n";
//очистить массив
    cout << "Удаленный массив : "<<"\n\n";
    vec.erase ( vec.begin(), vec.end() );
    copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
    cout << "\n\n";
 
return 0;
 
}
Вот этот фрагмент работает не верно
C++
1
2
3
4
5
6
7
8
9
10
11
 cout << "Очищенный массив : "<<"\n\n";
 vector<double>::iterator dmin, dmax;
 double nmin ,nmax;
  nmax = 0.71;
  nmin = 1.12;
  dmax = find( vec.begin(), vec.end(), nmax);
  vec.erase(vec.begin(),dmax );
  dmin = find( vec. begin(), vec.end(), nmin);
  vec.erase(dmin,vec.end() );
  copy(vec.begin(), vec.end(), ostream_iterator<double>(cout,", ") );
  cout << "\n\n";
Происходит сдвиг на 1 элемент влево исправить я так и не смог.Я понимаю,что нумерация элементов идет с 0.Но ведь я же указываю на сам элемент а не на его номер.Пробовал принудительно смещать толку нет.В чем то я ошибаюсь или чего то не правильно понял.Пожалуйста подскажите.
И еще по алгоритмам.Есть ли такой алгоритм сложения в векторе сложить каждый элемент с каждым элементом или составлять свой?Пример последовательность 1, 2, 3.Всех комбинаций будет 9. 1+1,1+2,1+3,2+1,2+2,2+3 и т.д Те что я нашел либо дают всю сумму вектора ,либо слаживают вектора.
Спасибо.
Yandex
Объявления
22.03.2013, 22:12     вектор алгоритм erase
Ответ Создать тему
Опции темы

Текущее время: 13:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru