В C++, почему делает string::find
вернуть size_type
и не iterator
?
Это имело бы смысл потому что функции как string::replace
или string::insert
возьмите итераторы в качестве входа, таким образом, Вы могли find
некоторый символ и сразу передает возвращенный итератор replace
, и т.д.
Кроме того, std::find
возвращает итератор - почему std::string::find
отличающийся?
Я предполагаю, что это потому, что в общем случае члены строк работают с индексами, а не с итераторами, и это упрощает использование возвращаемого значения. Вы всегда можете использовать std::find
, если хотите получить итератор.
Дизайн нового блестящего класса строк стандартной библиотеки был уже готов, когда Строуструп познакомил комитет по стандартизации с STL. Комитету понравилась STL, и он начал включать ее в стандарт, тем самым адаптируя многое из того, о чем они уже договорились (и, вероятно, также задерживая стандарт еще на год или два).
Среди прочих изменений, итераторы были добавлены к уже готовому классу string как нечто само собой разумеющееся. Вы можете увидеть это, посмотрев на различные члены string, принимающие/возвращающие позицию - это дикая смесь индексов и итераторов.
Не всегда легко догадаться, почему некоторые функции-члены имеют только версии, принимающие индексы, а некоторые - еще и версии, принимающие итераторы. В случае с std::basic_string<>::find()
, однако, это кажется простым: поскольку std::find()
уже возвращает итератор, std::basic_string<>::find()
оставили как есть.
Все строковые функции работают с индексами, некоторые функции (например, replace()
и insert()
) просто дополнительно поддерживают итераторы. Поэтому результат find()
может напрямую использоваться в этих функциях. Поскольку не может быть двух функций find()
, отличающихся только типом возвращаемого результата (одна возвращает итератор, другая - индекс), пришлось выбрать одну.
Возможно, полезнее получить число из find, потому что тогда вы сможете использовать []
оператор или substr()
, чтобы добраться до символов, которые вы только что искали.
Также, если вам нужен итератор, вы всегда можете сделать begin() + pos