Почему string :: find возвращает size_type, а не итератор? - PullRequest
24 голосов
/ 17 июня 2010

В C ++ почему string::find возвращает size_type, а не iterator?

Это имело бы смысл, потому что такие функции, как string::replace или string::insert, принимают итераторы в качестве входных данных, чтобы вы могли find некоторый символ и сразу передавать возвращенный итератор в replace и т. Д.

Кроме того, std::find возвращает итератор - почему std::string::find отличается?

Ответы [ 4 ]

26 голосов
/ 17 июня 2010

Проект блестящего нового класса строк стандартной библиотеки был уже сделан, когда Страуструп представил стандартную комиссию в STL.Комитету понравилось STL, и он начал включать его в стандарт, тем самым адаптируя многое из того, о чем они уже договорились (и, возможно, также отложив стандарт на другой год или два).

Среди других изменений, итераторы были добавлены в уже законченный класс строки как запоздалое размышление.Вы можете увидеть это, посмотрев на различные строковые члены, занимающие / возвращающие позицию - это дикое сочетание индексов и итераторов.

Не всегда легко догадаться, почему некоторые функции-члены имеют только версии, принимающие индексы, а некоторые - итераторы.Однако в случае std::basic_string<>::find() это кажется простым: поскольку std::find() уже возвращает итератор, std::basic_string<>::find() остался таким, каким был.

7 голосов
/ 17 июня 2010

Возможно, более полезно получить число из поиска, потому что тогда вы можете использовать оператор [] или substr(), чтобы получить символы, которые вы только что искали.итератор, вы всегда можете сделать begin() + pos

3 голосов
/ 17 июня 2010

Все строковые функции работают с индексами, некоторые функции (например, replace() и insert()) просто дополнительно поддерживают итераторы. Таким образом, результат find() может напрямую использоваться в этих функциях. Поскольку не может быть двух find() функций, которые просто отличаются по типу возвращаемого значения (одна возвращает итератор, другая возвращает индекс), нужно было выбирать одну.

0 голосов
/ 17 июня 2010

Я предполагаю, что это потому, что в общем случае строковые члены работают с индексами, а не итераторами, и это облегчает использование возвращаемого значения. Вы всегда можете использовать std::find, если хотите получить итератор.

...