Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
15.03.2013, 00:50     вектор алгоритм erase #2
Цитата Сообщение от Genn55 Посмотреть сообщение
Пишет,что erase не объявлен.
erase - это метод контейнера
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
15.03.2013, 00:56     вектор алгоритм erase #3
Цитата Сообщение от Genn55 Посмотреть сообщение
erase( vec.begin(), vec.end() );
почти...vec.erase(); будет немного лучше
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 00:57  [ТС]     вектор алгоритм erase #4
А что нужно сделать чтобы он работал?Компиллятор его принимает, по моему, как переменную поэтому так пишет.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
15.03.2013, 00:58     вектор алгоритм erase #5
как только вы напишите условие задачи, так сразу вам помогут
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 01:04  [ТС]     вектор алгоритм erase #6
У меня нет конкретной задачи.Я самостоятельно пытаюсь разобраться с вектором и с алгоритмами.В этом примере пытаюсь переписать все равные значения один раз.
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
15.03.2013, 01:06     вектор алгоритм erase #7
Цитата Сообщение от Genn55 Посмотреть сообщение
В этом примере пытаюсь переписать все равные значения один раз.
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
#include <algorithm>
#include <iterator>
#include <iostream>
#include <random>
#include <vector>
 
int main ()
{
    std::default_random_engine gen;
    std::uniform_int_distribution <> distr(0, 5);
 
    int vectorSize;
    std::cout << "Size of vector: ";
    std::cin >> vectorSize;
 
    std::vector <int> vector (vectorSize);
    std::cout << "Vector: " << std::endl;
    std::generate(vector.begin(), vector.end(), [&gen, &distr] () -> int {
        return distr(gen);
    });
    std::copy(vector.begin(), vector.end(), std::ostream_iterator <int> (std::cout, " "));
 
    std::cout << std::endl << "New vector: " << std::endl;
    std::sort(vector.begin(), vector.end());
    std::unique_copy(vector.begin(), vector.end(), std::ostream_iterator <int> (std::cout, " "));
 
    return 0;
}
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 01:21  [ТС]     вектор алгоритм erase #8
Скопировал код.Вот что получилось
Вложения
Тип файла: docx Doc6.docx (78.2 Кб, 5 просмотров)
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 01:39  [ТС]     вектор алгоритм erase #9
Почему то стал компеллиравть не код,а заголовочные функции.
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
// Copyright (C) 2007, 2009 Free Software Foundation, Inc.
//
// Этот файл является частью GNU ISO C++. Настоящая библиотека распространяется бесплатно
// программное обеспечение; вы можете повторно распространять ее и/или модифицировать ее в соответствии
// условия GNU General Public License, опубликованной
// Free Software Foundation; либо версии 3, либо (по вашему выбору)
// любой более поздней версии.
 
// Эта библиотека распространяется в надежде, что она будет полезной,
// но БЕЗ всякой ГАРАНТИИ; даже без подразумеваемой гарантии
// Или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. См.
// GNU General Public License for more details.
 
// В соответствии с Разделом 7 GPL версии 3, вы получаете дополнительные
// права доступа, описанные в GCC Runtime Library Исключением, версия
// 3.1, как, опубликованной Free Software Foundation.
 
// Вы должны были получить копию Лицензии GNU General Public License и
// копия GCC Runtime Library Исключением вместе с этой программой;
// см. файлы COPYING3 и COPYING.RUNTIME соответственно. Если нет, см.
// <http://www.gnu.org/licenses/>.
 
/** @файл include/c++0x_warning.h
* В Стандартной Библиотеки C++ заголовка.
*/
 
#ifndef _CXX0X_WARNING_H
#define _CXX0X_WARNING_H 1
 
#ifndef __GXX_EXPERIMENTAL_CXX0X__
#error Этот файл требует компилятора и библиотеки поддержки на предстоящих \
ISO C++, C++0x. Эта поддержка является экспериментальной, и, должно быть, \
включен с-std=c++0x или-std=gnu++0x опции компилятора.
#endif
 
#endif
Это мне выдал после компиляции.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
15.03.2013, 02:05     вектор алгоритм erase #10
C++
1
2
vector<int>::iterator uit = unique( vec.begin(), vec.end() );
vec.erase( uit, vec.end() );
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 15:53     вектор алгоритм erase #11
Genn55, Ведь написано же, что должен быть проставлен флажок -std=c++0x в опциях IDE или при компилировании из терминала
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 17:01  [ТС]     вектор алгоритм erase #12
Как это сделать? С английским туго,а весь интерфейс английский.Делаю только первые шаги в программировании.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 17:04     вектор алгоритм erase #13
Genn55, Гугл в помощь. Я не знаю, что у вас за IDE - раз. Даже если бы знал - не факт, что я сам ей пользовался.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 17:15  [ТС]     вектор алгоритм erase #14
code::blocks 10-05.Все что я нагуглил больше на английском, а на русском только кратенькие переводы.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
15.03.2013, 18:45     вектор алгоритм erase #15
Genn55, вы можете либо дополнить свой код моими строками, они не требуют 11 стандарта, либо зайти в Settings > Compiler and Debugger и в Compiler flags поставить плюсик на "Have g++ follow the coming C++0x ISO C++ language standard [-std=c++0x]"

Genn55, хотите стать программистом без знания английского? Тогда ожидайте, что средняя зарплата по городу будет вашим потолком. Сразу привыкайте к языку.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.03.2013, 23:27  [ТС]     вектор алгоритм erase #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 огрмное спасибо.Если не трудно покритикуйте.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
16.03.2013, 00:15     вектор алгоритм erase #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 цикл запихнуть.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
16.03.2013, 01:42  [ТС]     вектор алгоритм erase #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 ?
Что такое лямбда-функция?Просто написать свое функцию?
Спасибо.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
16.03.2013, 03:26     вектор алгоритм erase #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/WG...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;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2013, 03:48     вектор алгоритм erase
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.03.2013, 03:48     вектор алгоритм erase #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Genn55, хотите стать программистом без знания английского? Тогда ожидайте, что средняя зарплата по городу будет вашим потолком. Сразу привыкайте к языку.
Хочу заметить что учить английский также трудно/легко, как и сами плюсы.
Yandex
Объявления
16.03.2013, 03:48     вектор алгоритм erase
Ответ Создать тему
Опции темы

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