По данным cplusplus,
первый Последний
Итераторы, указывающие диапазон внутри строки] для удаления: [first,last). т. е. диапазон включает в себя все символы между первым и последним, включая символ, на который указывает первый, но не тот, на который указывает последний.
В котором first, last
— параметры функции string::erase
. Значит str.erase(0, 0)
должно работать. Однако он не удаляет ни один символ, и строка остается как обычно. Что странно, поскольку первый символ строки обозначается 0.
Однако при попытке str.erase(0, 1)
первый символ строки стирается, что имеет смысл, поскольку https://cplusplus.com формулирует это как «Включает все символы между первым и последним, включая символ, на который указывает первый, но не тот, на который указал последний.
Сначала я подумал, что отсутствие удаления последнего символа имеет приоритет над удалением первого символа, однако это не может быть правдой, поскольку запуск str.erase(1, 1)
стирает второй символ строки.
Почему это? Это проблема только самого языка?
Перегрузка, которую вы рассматриваете, предназначена для использования итераторов. Если вы передаете целочисленные значения, вы используете то, в котором вы указываете позицию и длину. А поскольку вы указываете нулевую длину, ничего не стирается.
См. en.cppreference.com/w/cpp/string/basic_string/erasestr.erase(0.0)
запустит версию (1) стирания, в которой указаны индекс и счетчик. Поскольку count = 0, вы ничего не стираете.
Кроме того, версия (3) стирания, которая требует размещения итераторов, а не чисел, стирает элементы в [first, last)
, поэтому, если first == last
, то она ничего не стирает.
Что касается итераторов, помните, что конец — это последний плюс один. Так что, даже если бы это сработало так, как вы ожидали, для этого потребовалось бы erase(0, 1)
.
Если бы вы вызвали перегрузку итератора с пустым диапазоном, например. str.erase(str.begin() + 1, str.begin() + 1)
, вы тоже не увидите ничего удаленного.
@user12002570 user12002570 Есть какая-то конкретная причина? Или просто личные предпочтения?
@somebodywhodoesntknowmuch Он более ухожен и актуален, чем cplusplus. И еще лучше написано.
@somebodywhodoesntknowmuch Его также труднее читать, чем cplusplus, но стоит приложить усилия, чтобы привыкнуть к его стилю. Это превосходный сайт, авторитетный, всеобъемлющий и т. д. Помимо того, что он является отличным справочным материалом, на нем можно многому научиться C++.
Целое число 0
не является итератором. Следовательно, str.erase(0,0)
вызывает перегрузку (index, count)
.
str.erase(0,0)
использует версию, которая принимает index
и count
. Из std::string::erase:
basic_string& erase( size_type index = 0, size_type count = npos ); (1) (constexpr since C++20)
- Удаляет символы
std::min(count, size() - index)
, начинающиеся сindex
.
Как видите, поведение заключается в удалении символов std::min(count, size() - index)
, начиная с первого переданного аргумента index
.
Несвязано: я бы рекомендовал cppreference вместо cplusplus.