Поведение функции STL remove () - только переставлять элементы контейнера? - PullRequest
2 голосов
/ 15 июля 2010

Я читал здесь, в StackOveflow и других источниках, что поведение функции удаления просто переупорядочивает исходный контейнер, так что элементы, которые должны быть удалены, перемещаются в конец контейнера и НЕ удаляются.Они остаются частью контейнера, а функция remove () просто возвращает итератор, который определяет конец диапазона элементов для сохранения.

Так что, если вы никогда не обрежете часть контейнера, имеющую значениякоторые были «удалены», они все равно должны присутствовать.

Но когда я запускаю приведенный ниже код, после алфавитно-цифровых символов, которые не были «удалены», нет пробелов.

int main()
{
    std::string test "this is a test string with a bunch of spaces to remove";
    remove(test.begin(), test.end(), ' ');
    std::cout << test << std::endl;

    return 0;
}

Что здесь происходит?Видя, что я никогда не вызываю test.erase (), разве в моей строке не должно быть концевых пробелов?Гарантируется ли, что «удаленные» элементы все еще будут присутствовать после вызова remove ()?

PS. Я не ищу предложений о том, как наилучшим образом удалить пробелы из строки, приведенное выше является просто иллюстративнымпример поведения remove (), которое меня смущает.

Ответы [ 2 ]

1 голос
/ 15 июля 2010

То, что осталось в конце вашего контейнера после вызова remove, не обязательно является элементами, которые были удалены. Это просто мусор. Скорее всего, это «что бы ни было в этих позициях до вызова удалить», но вы также не можете полагаться на это. Как и неинициализированная переменная, это может быть что угодно.

Например, строка:

"Hi I am Bob!\0"

после вызова remove избавиться от пробелов вероятно выглядит так

"HiIamBob!\0b!\0"

Вы не увидите этого на cout, потому что он прекратит печатать, как только нажмет '\ 0'.

0 голосов
/ 16 июля 2010

Возможно, вы захотите получить Boost.String .

Это набор алгоритмов для работы со строками.

boost::erase_all(test, " ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...