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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 960
#1

Как грамотно удалить элементы в векторе? - C++

18.10.2011, 12:47. Просмотров 2767. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
    for (vector<fileResult>::iterator p = listExp.begin(); p != listExp.end();p++) {
        if (p->select)
         listExp.erase(p);
    }
делаю так.
fileResult - структура.
C++
1
fileResult  listExp;
p->select - некоторое поле в структуре ,Если оно true. То из вектора надо удалить этот элемент.


Помогите разобраться.

Мой вариант не пашет, так как там видимо listExp.end() затирается как-то) то есть исключения обращения к памяти будут вылетать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2011, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как грамотно удалить элементы в векторе? (C++):

Удалить все повторяющиеся элементы в векторе - C++
доброго времени суток. Столкнулся с проблемой удаления лишних повторов чисел в векторе. Задача состоит в следующем: записать число...

Как применяя erase удалить в векторе n элементов, начиная с номера k? - C++
Помогите, как это записать, чтобы не возникало ошибок? arr.erase(arr.begin() + k, arraySize - (arr.begin() + k));

Удалить повторяющиеся объекты в векторе - C++
Есть 2 вектора. Копируем один вектор во второй. Потом во втором нужно удалить все объекты, в которых присутствуют одинаковые поля...

Повторяющиеся элементы в векторе - C++
Подскажите плс, что я делаю не так. Задача: ввести элементы вектора с клавиатуры, вывести на экран количество повторяющихся элементов (...

В векторе все элементы, большие среднего арифметического, заменить нулями - C++
В векторе x є Rn все элементы, которые больше среднего арифметическое заменить нулями Помогите понять и решить задание. Как понять у...

Удалить данные из вектора (игра в города) - не могу понять, почему данные остаются в векторе? - C++
Ребят, почему так выводит(все время первый город вектора)? vector&lt;string&gt; wcities; vector&lt;string&gt; Bot::Insert(string put) { ...

12
Bers
Заблокирован
18.10.2011, 12:53 #2
Цитата Сообщение от ht1515 Посмотреть сообщение
Мой вариант не пашет, так как там видимо listExp.end() затирается как-то) то есть исключения обращения к памяти будут вылетать.
После того как ты удаляешь элемент на который ссылается итератор, данный итератор становится не_валидным, и его нельзя продолжать использовать.
1
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 960
18.10.2011, 13:00  [ТС] #3
ну вот такой велосипед сделал , посмотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (vector<fileResult>::iterator p = listExp.begin(); p != listExp.end();p++) {
 
        if (p->select) {
         if (p == listExp.end()-1) {
           listExp.pop_back();
           break;
         }
         else {
         listExp.erase(p);
         p--;
         }
          }
    }
по феншую?
0
Bers
Заблокирован
18.10.2011, 13:06 #4
не знаю, что это за феншуй такой. Вот пример, как можно удалять элементы из мапы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef std::map<std::string,float> StringFloatMap;
   StringFloatMap coll;
   StringFloatMap::iterator pos, tmp_pos;
   ...
   //remove all elements having a certain value
   for (pos = c.begin(); pos != c.end(); ) {
       if (pos->second == value) {
           c.erase(pos++);   //Вот здесь! Элемент будит удален старый, 
                                      //но итератор будит указывать уже на следующий
                                      //валидный элемент!
  //дело в том, что итератор _уже_удаленого_элемента_ 
  //становится не валидным, и операции с ним могут привести 
  //к нехорошим последствиям.
       }
       else {
           ++pos;
       }
   }
1
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
18.10.2011, 13:07 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
listExp.resize(
      remove_if(
         listExp.begin(), 
         listExp.end(), 
         []
         (const fileResult& res)
         {
            return res.select;
         }
         
      )  - listExp.begin()
   );
1
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.10.2011, 13:07 #6
C++
1
vector.erase( std::remove_if( vector.begin(), vector.end(), [] ( const fileResult& x ) -> bool { return x.select; } ) , vector.end() );
1
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 960
18.10.2011, 13:28  [ТС] #7
всем спасибо, вообщем мой велосипед работает вроде тоже норм
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (vector<fileResult>::iterator p = listExp.begin(); p != listExp.end();p++) {
 
        if (p->select) {
         if (p == listExp.end()-1) {
           listExp.pop_back();
           break;
         }
         else {
         listExp.erase(p);
         p--;
         }
          }
    }
хотя наверно можно и без pop_back обойтись...

C++
1
2
3
4
5
6
7
8
9
    for (vector<fileResult>::iterator p = listExp.begin(); p != listExp.end();p++) {
 
    if (p->select) {
 
         listExp.erase(p);
         p--;
 
          }
    }
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 17:06 #8
p = listExp.erase(p);
--p; // необходимо сдвинуть, т.к. дальше ++
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.10.2011, 17:13 #9
ht1515, не, хрень.
те связку с erase и remove_if верно написали
0
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 960
18.10.2011, 18:27  [ТС] #10
Цитата Сообщение от OstapBender Посмотреть сообщение
ht1515, не, хрень.
а что так?
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.10.2011, 22:27 #11
ht1515, ну как минимум это
Код
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: c:\Documents and Settings\deg\Desktop\tests4\Debug\tests4.exe
File: d:\studio2008\vc\include\vector
Line: 138

Expression: ("this->_Has_container()", 0)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort   Retry   Ignore   
---------------------------
результат работы вашего кода.
0
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 960
18.10.2011, 22:45  [ТС] #12
ничего не понятно))) что могу сказать...
ну у меня код на билдере, норм работает...
ну то есть вроде исключений никаких , ни ошибок не выдает, тьфу тьфу тьфу
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
19.10.2011, 01:55 #13
ht1515, это лишь счастливая случайность.
честно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 01:55
Привет! Вот еще темы с ответами:

Как удалить элементы из масива? - C++
Здраствуйте, я новичок, не судите строго:) Вообщем с клавиатуры вводиться сообщение (Например, I_am_prodddgger), программа в свою очередь...

Как удалить элементы из очереди - C++
Подскажите пожалуйста как удалить элементы из статической очереди? К примеру есть 10 элементов в очереди, как их удалить?

Как удалить элементы из списка? - C++
Завтра сдавать. Вообще не знаю, как удалить. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

Как удалить чётные элементы массива - C++
Как удалить парные элементы массива


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
19.10.2011, 01:55
Ответ Создать тему
Опции темы

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