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

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

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

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

15.03.2013, 00:25. Просмотров 1375. Ответов 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;
}
Все работает кроме удаления.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 00:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос вектор алгоритм erase (C++):

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

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

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

26
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
15.03.2013, 23:27  [ТС] #16
С Вашими строками попробовал вроде работает,хотя результат не совсем тот,что нужен.Буду разбираться.Если не получится,можно обращаться?
Ну а насчет хорошего программиста...Да скорее всего не стану,не успею и в статистику зарплаты не попаду потому как мне ее и платить никто не будет.Там где я живу городом никак не назовешь и программисты не нужны ни хорошие ни плохие.Программировал когда то на Алголе в рамках ВУЗовской программы,попробовал впервые на с++ месяца 4 тому назад вроде получилось вот и заразился бросить уже не смогу несмотря на неудачи.
Спасибо.

Добавлено через 2 часа 23 минуты
Разобрался.Все работает.Вот что получилось
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
 
 
using namespace std;
 
int main()
{
int ia[] = { 0,1,2,0,1,4,0,4,2,3,5,1,4,3,0,5,1,2,4,2 };
   vector< int > vec( ia, ia+20 );
   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";
    sort( vec.begin(), vec.end() );
  vector<int>::iterator uit = unique( vec.begin(), vec.end() );
  vec.erase( uit, vec.end() );
        it = vec.begin(); end_it = vec.end();
     for ( ; it != end_it; ++ it ) cout << *it << ' ';
      cout << "\n\n";
 
      return 0;
}
MrGluck огрмное спасибо.Если не трудно покритикуйте.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7419 / 4534 / 673
Регистрация: 29.11.2010
Сообщений: 12,304
16.03.2013, 00:15 #17
Genn55, отступы пляшут.
В строке
C++
1
vector< int > vec( ia, ia+20 );
20 - magic number.
В С++11 можно делать так:
C++
1
vector< int > vec = { 0,1,2,0,1,4,0,4,2,3,5,1,4,3,0,5,1,2,4,2 };
Если все-таки по старому стандарту, то следует
C++
1
vector< int > vec( ia, ia + sizeof(ia)/sizeof(*ia) );
Все итераторы убрать в цикл for. И использовать префиксный инкремент взамен постфиксного (возможно,отладчик сам это исправит, но уповать на это не стоит).
Будет выглядеть так:
C++
1
for (vector<int>::iterator it = vec.begin(); it != end_it;  ++it)
Можно для удобства создать
C++
1
2
typedef vector<int>::iterator vecit;
for (vecit it = vec.begin(); it != end_it;  ++it)
хоть это и не обязательно.
Вывод в консоль я бы сделал через копирование в поток вывода на экран с помощью ostream_iterator
C++
1
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " ") );
требует хедера iterator.
И если бы мы говорили о С++11 я бы печать вектора вынес в отдельную лямбда-функцию.
Но вам сейчас главное с отступами разобраться, избавиться от magic number и итераторы в for цикл запихнуть.
0
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
16.03.2013, 01:42  [ТС] #18
Премного благодарен за критику и подсказки.Вот что у меня получилось
//удалить равные значения
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
 
 
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 };
 
 
 vector<double> vec( ia, ia + sizeof(ia)/sizeof(*ia) );
 vector<double>::iterator it = vec.begin(), end_it = vec.end();
 
 cout << "Начальный массив: " << "\n";
 typedef vector<double>::iterator vecit;
for (vecit it = vec.begin(); it != end_it;  ++it)
  cout << *it << ' ';
  cout << "\n\n";
 
        // удалить из контейнера ненужные элементы
 
  cout << "Полученный массив : "<<"\n";
  sort( vec.begin(), vec.end() );
  vector<double>::iterator uit = unique( vec.begin(), vec.end() );
  vec.erase( uit, vec.end() );
  it = vec.begin(); end_it = vec.end();
for ( vecit uit = unique( vec.begin(), vec.end());it != end_it;  ++ it )
  cout << *it << ' ';
  cout << "\n\n";
 
return 0;
}
И возникли вопросы,может быть и глупые.
Если я перейду на С++ 11 что произойдет с ранее созданными проектами?
Что значит требует хедера iterator ?
Что такое лямбда-функция?Просто написать свое функцию?
Спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7419 / 4534 / 673
Регистрация: 29.11.2010
Сообщений: 12,304
16.03.2013, 03:26 #19
Отступы все равно пляшут. Тело цикла должно быть правее инструкции.
C++
1
vector<double>::iterator it = vec.begin(), end_it = vec.end();
строчку удалите вообще.
Во втором случае вывод делаете также, как и в первом:
C++
1
for (vecit it = vec.begin(); it != end_it; ++it)
typedef (синоним фактически) лучше сделать либо до main, либо в самом начале. И раз уж его используйте, то незачем писать долгие конструкции vector<double>::iterator.

Цитата Сообщение от Genn55 Посмотреть сообщение
Если я перейду на С++ 11 что произойдет с ранее созданными проектами?
Скорее всего, останутся полностью совместимыми (хотя многое может быть и deprecated). Рассматривайте это как расширение языка, возможность использования другого инструментария.

Цитата Сообщение от Genn55 Посмотреть сообщение
Что значит требует хедера iterator ?
Определено в заголовочном файле iterator, требует
C++
1
#include <iterator>
Цитата Сообщение от Genn55 Посмотреть сообщение
Что такое лямбда-функция?
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf 5.1.2 Lambda expretions
http://ru.wikipedia.org/wiki/C%2B%2B...BD.D0.B8.D1.8F
http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B
Выглядело бы так:
C++
1
2
3
4
5
auto print_v = [](const std::vector<double>& v)
{
    std::copy(v.begin(), v.end(), std::ostream_iterator<double> (std::cout, " "));
    std::cout << std::endl;
};
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.03.2013, 03:48 #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Genn55, хотите стать программистом без знания английского? Тогда ожидайте, что средняя зарплата по городу будет вашим потолком. Сразу привыкайте к языку.
Хочу заметить что учить английский также трудно/легко, как и сами плюсы.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7419 / 4534 / 673
Регистрация: 29.11.2010
Сообщений: 12,304
16.03.2013, 04:00 #21
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хочу заметить что учить английский также трудно/легко, как и сами плюсы.
если в школе не прогуливать - не сложно.
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.03.2013, 04:01 #22
Цитата Сообщение от MrGluck Посмотреть сообщение
если в школе не прогуливать - не сложно.

Не по теме:

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

0
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
17.03.2013, 01:43  [ТС] #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() не получится? В функцию вставить тоже не получилось.Так что поработать есть над чем.
Еще раз огромное спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7419 / 4534 / 673
Регистрация: 29.11.2010
Сообщений: 12,304
17.03.2013, 02:26 #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), ", ") );
0
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
17.03.2013, 02:55  [ТС] #25
А у меня почему то не получилось,написал так же.Наверное все же была какая то ошибка.Уже не сравню-удалил.
Читаю про лямбда-функцию,если я правильно понял,переменной присваивается функция т.е это фактически переменная.У вас написано auto перед названием функции,но если она ничего не передает это же void ?А почему auto ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7419 / 4534 / 673
Регистрация: 29.11.2010
Сообщений: 12,304
17.03.2013, 03:08 #26
Genn55, это как бы анонимная функция, функция без названия. Но грубо говоря так.
auto - ключевое слово, позволяющее создать переменную типа инициализирующего значения, т.е. идентификатор типа определяется компилятором самостоятельно, в нашем случае это лямбда-функция. Тем не менее, сама по себе она не имеет названия.

Почитайте также про ключевое слово auto, если действительно интересно, но вообще то это уже необязательные надстройки, вам желательно сначала полностью понять как устроен код без них.
0
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
22.03.2013, 22:12  [ТС] #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 и т.д Те что я нашел либо дают всю сумму вектора ,либо слаживают вектора.
Спасибо.
0
22.03.2013, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 22:12
Привет! Вот еще темы с ответами:

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

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов - C++
Привет! Задача следующая. Нужно реализовать класс &quot;вектор&quot; с конструкторами, которые позволяют создать нулевой вектор и вектор с...

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

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

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