Начнем с того, что интерфейс std::string
хорошо известен как раздутый и непоследовательный, см. Статью Gotw84 от Herb Sutter на эту тему. Но, тем не менее, существует причина, по которой std::string::find
возвращает индекс: std::string::substr
. Эта вспомогательная функция-член работает с индексами, например,
const std::string src = "abcdefghijk";
std::cout << src.substr(2, 5) << "\n";
. Вы можете реализовать substr
таким образом, чтобы она принимала итераторы в строку, но тогда нам не пришлось бы долго ждать громких жалоб на то, что std::string
непригоден и нелогичен. Поэтому, учитывая, что std::string::substr
принимает индексы, как найти индекс первого вхождения 'd'
в указанной выше входной строке, чтобы распечатать все, начиная с этой подстроки?
const auto it = src.find('d'); // imagine this returns an iterator
std::cout << src.substr(std::distance(src.cbegin(), it));
Это можеттоже не будь, что хочешь. Следовательно, мы можем позволить std::string::find
вернуть индекс, и вот мы:
const std::string extracted = src.substr(src.find('d'));
Если вы хотите работать с итераторами, используйте <algorithm>
. Они позволяют вам как
auto it = std::find(src.cbegin(), src.cend(), 'd');
std::copy(it, src.cend(), std::ostream_iterator<char>(std::cout));