Удаление неверного символа с помощью std :: remove

Возможный дубликат:
Удалить пробелы из std :: string в C ++
std :: remove не работает

Я использую std :: remove, чтобы удалить некоторые символы из строки.
Например:

std::string hash_value = "3f-2b-d6-ab-aa-6d-62-b4-ce-6f-6b-2f-21-4c-99-fc";
std::remove(hash_value.begin(), hash_value.end(), '-');

После этого hash_value размер должен быть 32 и иметь значение:

3F2BD6ABAA6D62B4CE6F6B2F214C99FC

Но это 47 размер и ценность:

3F2BD6ABAA6D62B4CE6F6B2F214C99FC-2F-21-4C-99-FC

Можете ли вы помочь мне, что я делаю не так?
Спасибо!

2

Решение

Вам нужно использовать удалить-стереть идиома. std :: remove только перемещает элементы в конец контейнера, вам нужно стереть их потом.

пытаться

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
4

Другие решения

станд :: удалить переупорядочивает содержимое последовательности так, чтобы «удаленные» элементы находились в конце, где конец определяется как диапазон между итератором, возвращаемым функцией, и концом последовательности. Если вы хотите сделать вашу последовательность короче, используйте стереть-удалить идиому.

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
2

Функция не может изменять свойства объекта, содержащего диапазон элементов (то есть она не может изменять размер массива или контейнера): удаление выполняется путем замены элементов, которые сравниваются равными val, на следующий элемент, который не и сообщая о новом размере сокращенного диапазона, возвращая итератор к элементу, который должен рассматриваться как его новый элемент «конец в конец».

Например, посмотрите на приведенный ниже пример, связанный с std :: remove

int myints [] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20

// границы диапазона:

int * pbegin = myints; // ^

int * pend = myints + sizeof (myints) / sizeof (int);

// ожидаем точки до контейнера (логического) конца сейчас

pend = std :: remove (pbegin, pend, 20);

станд :: соиЬ << «диапазон содержит:»;

for (int * p = pbegin; p! = pend; ++ p)

станд :: соиЬ << » << *п;

Будет отображаться

Ассортимент содержит: 10 30 30 10 10

0
По вопросам рекламы [email protected]