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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
18.10.2011, 12:47     Как грамотно удалить элементы в векторе? #1
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() затирается как-то) то есть исключения обращения к памяти будут вылетать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
18.10.2011, 12:53     Как грамотно удалить элементы в векторе? #2
Цитата Сообщение от ht1515 Посмотреть сообщение
Мой вариант не пашет, так как там видимо listExp.end() затирается как-то) то есть исключения обращения к памяти будут вылетать.
После того как ты удаляешь элемент на который ссылается итератор, данный итератор становится не_валидным, и его нельзя продолжать использовать.
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
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--;
         }
          }
    }
по феншую?
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;
       }
   }
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
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()
   );
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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() );
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
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--;
 
          }
    }
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 17:06     Как грамотно удалить элементы в векторе? #8
p = listExp.erase(p);
--p; // необходимо сдвинуть, т.к. дальше ++
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.10.2011, 17:13     Как грамотно удалить элементы в векторе? #9
ht1515, не, хрень.
те связку с erase и remove_if верно написали
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
18.10.2011, 18:27  [ТС]     Как грамотно удалить элементы в векторе? #10
Цитата Сообщение от OstapBender Посмотреть сообщение
ht1515, не, хрень.
а что так?
OstapBender
 Аватар для OstapBender
581 / 519 / 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   
---------------------------
результат работы вашего кода.
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
18.10.2011, 22:45  [ТС]     Как грамотно удалить элементы в векторе? #12
ничего не понятно))) что могу сказать...
ну у меня код на билдере, норм работает...
ну то есть вроде исключений никаких , ни ошибок не выдает, тьфу тьфу тьфу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 01:55     Как грамотно удалить элементы в векторе?
Еще ссылки по теме:

Удалить повторяющиеся объекты в векторе C++
C++ Как удалить элементы из очереди
C++ Как удалить элементы из масива?

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

Или воспользуйтесь поиском по форуму:
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
19.10.2011, 01:55     Как грамотно удалить элементы в векторе? #13
ht1515, это лишь счастливая случайность.
честно.
Yandex
Объявления
19.10.2011, 01:55     Как грамотно удалить элементы в векторе?
Ответ Создать тему
Опции темы

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