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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Genn55
360 / 207 / 39
Регистрация: 26.12.2012
Сообщений: 694
#1

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

15.03.2013, 00:25. Просмотров 1281. Ответов 26
Метки нет (Все метки)

Доброго всем времени суток.Пожалуйста подскажите чайнику.Пытаюсь из контейнера убрать лишние данные с помощью 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
Посмотрите здесь:

Двумерынй вектор, удаление через erase - C++
Есть двумерный вектор Clusters: std::vector &lt;std::vector &lt;int&gt; &gt; Clusters (ExternalSetV.size(), std::vector &lt;int&gt; (1)); Изначально...

Шаблон класса вектор с операциями индексации и функциями insert и erase - C++
У меня есть задача. функции erase и insert я реализовала. но чтобы они работали нужно написать LOL&amp; operator(int); Задача звучит...

Алгоритм решения. Записать в вектор индексы элементов от максимального к минимальному - C++
Добрый день. Подскажите пожалуйста алгоритм решения. Его суть - нужно записать в весктор индексы элементов от максимального к минимальному.

.erase() в массиве. - C++
есть массив вектор например: vector&lt; pair&lt;char,int&gt; &gt; k; k.second мне надо его удалить как воспользоваться функции k.erase() ;...

vector::erase()? - C++
есть вектор структур struct person{ string name; int age; vector &lt;person&gt; repw;

Erase map - C++
Добрый день, мне необходимо удалить из MAP некоторое количество элементов, сейчас я делаю это вот так, но как то не очень красиво for (i...

vector.erase - C++
Помогите пожалуйста с синтаксисом удаления любого элемента из вектора Вот тут ошибка: #include &lt;vector.h&gt; void main() { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
7004 / 4175 / 595
Регистрация: 29.11.2010
Сообщений: 11,077
16.03.2013, 04:00     вектор алгоритм erase #21
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хочу заметить что учить английский также трудно/легко, как и сами плюсы.
если в школе не прогуливать - не сложно.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.03.2013, 04:01     вектор алгоритм erase #22
Цитата Сообщение от MrGluck Посмотреть сообщение
если в школе не прогуливать - не сложно.

Не по теме:

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

Genn55
360 / 207 / 39
Регистрация: 26.12.2012
Сообщений: 694
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
Модератор
Эксперт CЭксперт С++
7004 / 4175 / 595
Регистрация: 29.11.2010
Сообщений: 11,077
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
360 / 207 / 39
Регистрация: 26.12.2012
Сообщений: 694
17.03.2013, 02:55  [ТС]     вектор алгоритм erase #25
А у меня почему то не получилось,написал так же.Наверное все же была какая то ошибка.Уже не сравню-удалил.
Читаю про лямбда-функцию,если я правильно понял,переменной присваивается функция т.е это фактически переменная.У вас написано auto перед названием функции,но если она ничего не передает это же void ?А почему auto ?
MrGluck
Модератор
Эксперт CЭксперт С++
7004 / 4175 / 595
Регистрация: 29.11.2010
Сообщений: 11,077
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
Еще ссылки по теме:

Реализация функции erase() - C++
Как работает erase()? То есть, если у нас : prev, it, next - итераторы и выполняя erase(it), она очистит память, которую занимала it и...

list не работает erase - C++
void in_out_Park(list&lt;Bus&gt; &amp;in, list&lt;Bus&gt; &amp;out) { int n, i=0; Bus temp; cout&lt;&lt;&quot;Введите номер автобуса: &quot;; cin&gt;&gt;n; ...

Шаблоны: insert, erase - C++
У меня проблема, как именно нужно описать main и проблема с функцией insert, мне сказали, что в ней может не быть места, чтобы вставить...

stl::list erase() - C++
вот такой код есть, но не работает. как подправить? list&lt;int&gt; ls; list&lt;int&gt;::iterator it; for(int i=0; i&lt;5; i++) { ...

Крах при vector.erase() - C++
Всё вроде бы работает так, как мне надо...но когда остаётся 1 элемент и его нужно очистить, программа крашится. Что я сделал не так? ...


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

Или воспользуйтесь поиском по форуму:
Genn55
360 / 207 / 39
Регистрация: 26.12.2012
Сообщений: 694
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru