2015-10-18 2 views
0

У меня есть вектор с типом char;Как удалить элемент из вектора <char>?

vector<char> a_chars; 

и содержит 6 символов, но 3 из них являются дубликатами. Как удалить дубликат char? Вот мой текущий код и оно не компилировать:

for(int i = 0; i < a_chars.size(); i++) 
    { 
     char current = a_chars.at(i); 
     for(int j = i+1; j < a_chars.size(); j++) 
     { 
      if (current == a_chars.at(j)) 
      { 
       a_chars.erase[j]; 
      } 
     } 
    } 

здесь ошибка компиляции: «C: недействительные типы„[INT]“для массива подстрочный |»

EDIT: Также я пробовал с a_chars.erase(j) и a_chars.erase(a_chars.at(j) и все еще имел ошибку компиляции.

+0

ошибка в этой строке «a_chars.erase [j];» – AleksandarAngelov

+0

Вы знаете, что ['std :: vector :: erase'] (http://en.cppreference.com/w/cpp/container/vector/erase) является членом * function *? –

+0

Вам также нужно подумать о том, что произойдет, когда вы удалите элемент и как повлияет ваша индексация. –

ответ

0

После некоторых попыток я узнал сам. Он не работает с a_chars.erase[j]; или a_chars.erase(j); ни a_chars.erase(a_chars.at(j));. Все, что мне нужно было сделать, это сделать итератор и сделать его таким же, как «j».

   vector<char>::iterator itr = a_chars.begin(); 
       itr+=j; 
       a_chars.erase(itr); 
3

Вы можете использовать std::unique с комбинацией метода vector::erase (известный как erase-remove idiom). Однако вектор должен быть отсортирован.

vector<char> a_chars; 
std::sort(a_chars.begin(), a_chars.end()); 
a_chars.erase(std::unique(a_chars.begin(), a_chars.end()), a_chars.end()); 

Если вы не хотите сортировать свой vector. Вы можете использовать следующий фрагмент, чтобы удалить дубликаты.

void remove_duplicities(std::vector<char>& vec) 
{ 
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) 
    { 
     for (auto jter = std::next(iter); jter != vec.end(); ++jter) 
     { 
      if (*iter == *jter) 
       jter = std::prev(vec.erase(jter)); 
     } 
    } 
} 
+2

Это работает, только если его не интересует основной заказ. – Esus

+0

@Esus Затем используйте std :: stable_sort ... Я думаю, что его проблемы еще не на данный момент в разработке, а скорее на функции членов. – dascandy

+0

@ dascandy, так как '' '' '' '' 'содержит' char ', порядок не имеет значения. – Zereges