2013-07-05 2 views
-2

У меня есть векторный темп = {1,2,2,3,4}. Как найти все elem = 2, сохранить там позиции в другом векторе и удалить из первого.Найти все элементы в векторе и удалить их

vector<int> another 
vector<int>::iterator it; 
for (it = temp.begin(); it != temp.end();) 
{ 
    if (it == elem) { //? 
     another.push_back(it); //? 
     temp.erase(it++); 
    } 
    else 
    { 
     ++it; 
    } 
} 
+0

первый отступ вашего кода –

+0

Не компилируется. –

+0

Что вы подразумеваете под _save there position_? После удаления позиции будут недействительными. – hmjd

ответ

1

Чтобы сохранить позиции:

#include <iterator> 

for (auto it = temp.begin(); it != temp.end(); ++it) 
    if (*it == 2) 
     another.push_back(std::distance(temp.begin(), it)); 

для стирания:

#include <algorithm> 

temp.erase(std::remove(temp.begin(), temp.end(), 2), temp.end()); 

Это работает для более широкого класса контейнеров, чем просто векторы, благодаря типичности итераторы.

3
std::remove(vec.begin(), vec.end(), 2); 

это следует сделать трюк.

(Конечно, на самом деле удалить их из вектора, вы должны написать

vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end()); 

по erase-remove idiom.)

Edit: Просто заметил:

сохранить их позиции в другом векторе

(«с оружием в там рук», не так ли?) - в основном это не делает много смысла, позиции будут недействительны при удалении элементов из контейнера ...

+0

Вы хотите сохранить свои позиции в другом векторе, но –

+0

@ Magtheridon96 Затем 'std :: remove_if()' и предикат должен позаботиться об этом. –

+0

Вам нужно удалить элементы из контейнера. После [Erase-remove-ideom] (http://en.wikipedia.org/wiki/Erase-remove_idiom) – andre

Смежные вопросы