std::basic_string<CharT,Traits,Allocator>::erase — cppreference.com
Материал из cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
| (1) | ||
|
|
(до C++20) | |
|
|
(начиная с C++20) | |
| (2) | ||
|
|
(до C++11) | |
|
|
(начиная с C++11) (до C++20) |
|
|
|
(начиная с C++20) | |
| (3) | ||
|
|
(до C++11) | |
|
|
(начиная с C++11) (до C++20) |
|
|
|
(начиная с C++20) | |
Удаляет указанные символы из строки.
1) Удаляет std::min(count, size() - index) символов, начиная с index.
2) Удаляет символ в позиции position.
3) Удаляет символы в диапазоне [first, last).
Параметры
| index | — | первый символ для удаления |
| count | — | количество символов для удаления |
| position | — | итератор для удаляемого символа |
| first, last | — | диапазон символов для удаления |
Возвращаемое значение
1) *this
2) Итератор, указывающий на символ, следующий сразу за удалённым символом, или end(), если такого символа не существует.
3) Итератор, указывающий на символ last, на который указывает перед удалением, или end(), если такого символа не существует.
Исключения
1) std::out_of_range, если index > size().
2,3) Ничего не генерирует.
Если по какой-либо причине генерируется исключение, эта функция не имеет эффекта (строгая гарантия безопасности исключений).
Пример
#include <algorithm> #include <iostream> #include <iterator> #include <string> int main() { std::string s = "This Is An Example"; std::cout << "1) " << s << '\n'; s.erase(7, 3); // удаляет " An", используя перегрузку (1) std::cout << "2) " << s << '\n'; s.erase(std::find(s.begin(), s.end(), ' ')); // удаляет первый ' '; перегрузка (2) std::cout << "3) " << s << '\n'; s.erase(s.find(' ')); // обрезает от ' ' до конца строки; перегрузка (1) std::cout << "4) " << s << '\n'; auto it = std::next(s.begin(), s.find('s')); // получает итератор для первого 's' s.erase(it, std::next(it, 2)); // удаляет "sI"; перегрузка (3) std::cout << "5) " << s << '\n'; }
Вывод:
1) This Is An Example 2) This Is Example 3) ThisIs Example 4) ThisIs 5) This
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 27 | C++98 | перегрузка (3) не удаляла символ, на который указывает last,но возвращала итератор, указывающий на символ, следующий сразу за этим символом |
возвращает итератор, указывающий на этот символ |
| LWG 428 | C++98 | перегрузка (2) явно требует, чтобы position был допустимым,но SequenceContainer требует, чтобы он был разыменовываемым (более строго) |
удалено явное требование |
| LWG 847 | C++98 | не было гарантии безопасности исключений | добавлена надежная гарантия безопасности исключений |