2014-01-27 3 views
1

Я создаю вектор внутри с несколькими элементами в C++, и я хочу удалить элементы вектора с теми же значениями. В принципе, я хочу удалить весь индекс вектора, в котором найден дублирующий элемент. Мой вектор называется человеком. Я пытаюсь сделать что-то вроде:Удалить дубликат элемента из вектора

for(int i=0; i < person.size(); i++){ 
    if(i>0 && person.at(i) == person.at(0:i-1)) { // matlab operator 
     continue; 
    } 
    writeToFile(perason.at(i)); 
} 

Как можно создать оператор 0: я-1, чтобы проверить все возможные комбинации индексов?

Edit: Я пытаюсь решение Garman, но я получил вопросы для каждого:

 set<string> myset; 
     vector<string> outputvector; 

     for (string element:person) 
     { 
      if (myset.find(element) != myset.end()) 
      { 
       myset.insert(element); 
       outputvector.emplace_back(element); 
      } 
     } 
+1

Вы можете выбрать вектор? – juanchopanza

+0

Возможный дубликат [Удалить элементы из вектора C++, где условие удаления зависит от других элементов] (http://stackoverflow.com/questions/9412434/remove-elements-from-ac-vector-where-the-removal- condition-is-dependent-on-ot) – stijn

+0

Нет, его действительно необходимо оставаться неподвижным. –

ответ

3

Вот «на месте» версия (без второго вектора требуется), которые должны работать с более старыми компиляторами:

std::set<std::string> seen_so_far; 
for (std::vector<std::string>::iterator it = person.begin(); it != person.end();) 
{ 
    bool was_inserted = seen_so_far.insert(*it).second; 
    if (was_inserted) 
    { 
     ++it; 
    } 
    else 
    { 
     swap(*it, person.back()); 
     person.pop_back(); 
    } 
} 

Позвольте мне знать, если это работает для вас. Обратите внимание, что порядок элементов не может оставаться неизменным.

+0

Я думаю, что это работает, позвольте мне проверить немного больше. –

2

Если вы можете sort ваш vector, вы можете просто позвонить std::unique.

#include <algorithm>  

std::sort(person.begin(), person.end()); 
person.erase(std::unique(person.begin(), person.end()), person.end()); 

Если вы не можете sort, вы можете использовать вместо hash-table путем сканирования вектора и обновить хеш-таблицы соответственно. В то же время вы можете легко проверить, существует ли один элемент уже существующий или нет в O(1)O(n)). Вам не нужно проверять все остальные элементы для каждого из них, что будет дорогостоящим O(n^2).

+0

Кажется, OP не может сортировать вектор, поэтому нужен другой подход. – juanchopanza

+0

@juanchopanza Обновлено. Благодарю. – herohuyongtao

2

Что-то, как это будет работать

unordered_set<same_type_as_vector> myset; 
vector<same_type_as_vector> outputvector; 
for (auto&& element: myvector) 
{ 
    if (myset.find(element) != myset.end()) 
    { 
     myset.insert(element); 
     outputvector.emplace_back(element); 
    } 
} 
myvector.swap(outputvector); 

код, написанный в поле ответа, поэтому может потребоваться дополнительная настройка.

+0

Неожиданный токен: инструкция for (auto && element: myvector). –

+0

Как я уже сказал, код может потребовать настройки. Вы используете компилятор moderm? Вы переименовали myvector в свой вектор? – GarMan

+1

Я отредактировал ответ –

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