Возможный дубликат:
Удалить пробелы из 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
Можете ли вы помочь мне, что я делаю не так?
Спасибо!
Вам нужно использовать удалить-стереть идиома. std :: remove только перемещает элементы в конец контейнера, вам нужно стереть их потом.
пытаться
hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
станд :: удалить переупорядочивает содержимое последовательности так, чтобы «удаленные» элементы находились в конце, где конец определяется как диапазон между итератором, возвращаемым функцией, и концом последовательности. Если вы хотите сделать вашу последовательность короче, используйте стереть-удалить идиому.
hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
Функция не может изменять свойства объекта, содержащего диапазон элементов (то есть она не может изменять размер массива или контейнера): удаление выполняется путем замены элементов, которые сравниваются равными 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