Почему `str.erase(0, 0)` не удаляет первый символ строки?

По данным cplusplus,

первый Последний

Итераторы, указывающие диапазон внутри строки] для удаления: [first,last). т. е. диапазон включает в себя все символы между первым и последним, включая символ, на который указывает первый, но не тот, на который указывает последний.

В котором first, last — параметры функции string::erase. Значит str.erase(0, 0) должно работать. Однако он не удаляет ни один символ, и строка остается как обычно. Что странно, поскольку первый символ строки обозначается 0.

Однако при попытке str.erase(0, 1) первый символ строки стирается, что имеет смысл, поскольку https://cplusplus.com формулирует это как «Включает все символы между первым и последним, включая символ, на который указывает первый, но не тот, на который указал последний.

Сначала я подумал, что отсутствие удаления последнего символа имеет приоритет над удалением первого символа, однако это не может быть правдой, поскольку запуск str.erase(1, 1) стирает второй символ строки.

Почему это? Это проблема только самого языка?

Несвязано: я бы рекомендовал cppreference вместо cplusplus.

user12002570 02.08.2024 10:37

Перегрузка, которую вы рассматриваете, предназначена для использования итераторов. Если вы передаете целочисленные значения, вы используете то, в котором вы указываете позицию и длину. А поскольку вы указываете нулевую длину, ничего не стирается.

Some programmer dude 02.08.2024 10:38

См. en.cppreference.com/w/cpp/string/basic_string/erasestr.erase(0.0) запустит версию (1) стирания, в которой указаны индекс и счетчик. Поскольку count = 0, вы ничего не стираете.

ALX23z 02.08.2024 10:38

Кроме того, версия (3) стирания, которая требует размещения итераторов, а не чисел, стирает элементы в [first, last), поэтому, если first == last, то она ничего не стирает.

ALX23z 02.08.2024 10:41

Что касается итераторов, помните, что конец — это последний плюс один. Так что, даже если бы это сработало так, как вы ожидали, для этого потребовалось бы erase(0, 1).

Some programmer dude 02.08.2024 10:41

Если бы вы вызвали перегрузку итератора с пустым диапазоном, например. str.erase(str.begin() + 1, str.begin() + 1), вы тоже не увидите ничего удаленного.

Caleth 02.08.2024 10:44

@user12002570 user12002570 Есть какая-то конкретная причина? Или просто личные предпочтения?

somebodywhodoesntknowmuch 02.08.2024 10:50

@somebodywhodoesntknowmuch Он более ухожен и актуален, чем cplusplus. И еще лучше написано.

user12002570 02.08.2024 10:51

@somebodywhodoesntknowmuch Его также труднее читать, чем cplusplus, но стоит приложить усилия, чтобы привыкнуть к его стилю. Это превосходный сайт, авторитетный, всеобъемлющий и т. д. Помимо того, что он является отличным справочным материалом, на нем можно многому научиться C++.

john 02.08.2024 11:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Целое число 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)
  1. Удаляет символы std::min(count, size() - index), начинающиеся с index.

Как видите, поведение заключается в удалении символов std::min(count, size() - index), начиная с первого переданного аргумента index.

Другие вопросы по теме