2016-05-12 2 views
3

Я пытаюсь удалить каждый '0' в std::string, начиная со спины. Согласно this, существует несколько способов обратного итератора .erase.string erase добавляет элементы с обратными итераторами

Странно то, что все они присоединяют цифры к std::string, а не стирают их!

Вот Немного образцов

//'str' will be "5.090000" 
std::string str = std::to_string(5.09); 

auto it = std::remove_if(str.rbegin(), str.rend(), [](char value) { 
    return value == '0'; 
}); 

1) Пред- C++11 путь:

str.erase(--(it.base())); 

2) C++11 способ (1)

str.erase(std::next(it).base()); 

3) C++11 путь (2)

std::advance(it, 1); 
str.erase(it.base()); 

Во всех случаях str == "5.095.9". Зачем? Потому что, как я это вижу, str должен быть 5.9, но это не так ...

Моя догадка, что я делаю что-то неправильно с задом итераторов, потому что если вы разбить строку: 5.09 | 5.9, первое значение все еще находится между '0', но не последними. Второе значение на самом деле является ожидаемым std::string.

Что я делаю неправильно?

+2

Посмотрите документацию 'станд :: remove_if' очень тщательно, и думать о диапазоне вы манипулировали. –

+0

Я никогда не использовал обратные итераторы, но моя наивная догадка заключалась в том, что вы должны использовать их следующим образом: 'std :: remove_if (str.rend(), str.rbegin(), [] (значение char)' – user463035818

+0

@KerrekSB ups, я испортил ему упражнение rtfm? – user463035818

ответ

1

Я сделал 2 ошибки в моем подходе:

  • erase вызывается только с 1 итератором удаляет элемент итератор, указывающий на, а не от итератора до конца (как я ошибочно полагал)

Так str.erase(std::next(it).base(), str.end()); - это все-таки не так, продолжайте чтение;)

  • Как @KerrekSB отметил, что я не читал the docs достаточно тщательно: потому что я использую std::reverse_iterator, элементы возвращаются на спереди! Итак, поскольку it указывает на новый конечный итератор (который BTW до не удаленных элементов), мне нужно удалить диапазон с начала (str.begin()) до it.base().


TL; DR

Новая рабочая версия: str.erase(str.begin(), it.base());

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