Почему стандарт C++ сохраняет такую избыточную функцию? [закрытый]


  1. Std:: string:: find 's prototype:

    size_type find( CharT ch, size_type pos = 0 ) const;
    
  2. Std::string:: find_first_of прототип:

    std::size_type find_first_of( CharT ch, size_type pos = 0 ) const;
    

Оба имеют одну и ту же функцию. Но очевидно, что последнее излишне.

Я думаю, что эта избыточность приведет пользователя в замешательство, потому что find_first_of означает "найти любого из заданных символов", а не "найти данный символ".

Почему стандарт C++ сохраняет такую избыточную функцию?

3   3   2016-12-27 10:21:44

3 ответа:

Существует тонкая разница между ними. Бьярне разъясняет их использование следующим образом:

Функции find_∗_of() отличаются от find() и rfind() тем, что ищутодин символ, а невсю последовательность символов.

string s {"accdcde"};
auto i1 = s.find("cd");           // i1==2 s[2]=='c' && s[3]=='d'
auto i2 = s.rfind("cd");          // i2==4 s[4]=='c' && s[5]=='d'
auto i3 = s.find_first_of("cd");  // i3==1 s[1]=='c'
auto i4 = s.find_last_of("cd");   // i4==5 s[5]=='d'

Редактировать:

Как справедливо заметил @juanchopanza, это уточнение не совсем относится к перегруженной версии (принимая char), представленной OP.

Есть есть ли какое-то обоснование?

IMO, find_first_of( char, pos) могли бы возникнуть как случай обеспечения согласованности по подписи своего партнера find_last_of( char, pos), которая имеет обратную функциональность по сравнению с find(char, pos), которая идет слева направо.

Обратите внимание, что find(char, pos) может заменить find_first_of( char, pos), но не find_last_of( char, pos). Отсутствие find_first_of( char, pos) может привести к некоторой путанице в разработчиках, поэтому лучше иметь и эту перегруженную версию.

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

find() и find_first_of() - это оба семейства функций.

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

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

В то время как можно смешать два (логически), заставляя разработчика, который в противном случае использует find_first_of(), Использовать find(), или наоборот, делает код немного сложнее рассуждать, следовательно, труднее получить правильный, труднее поддерживать.

Усилия по определению таких функций (в стандартно, усилия по разработке таких функций (один раз, за реализацию) значительно меньше, чем усилия многих разработчиков, которым приходится больше думать о том, какие функции они используют, и поэтому им приходится больше работать, чтобы заставить свои программы работать правильно, а затем поддерживать.

std::string::find и еще std::string::find_first_of Не выполняйте ту же функцию.

Для std::string::find:

Находит первую подстроку, равную заданной последовательности символов. Поиск начинается с pos, то есть найденная подстрока не должна начинаться в позиции, предшествующей pos.

Для std::string::find_first_of:

Находит первый символ, равный одному из символов в данной последовательности символов. Поиск учитывает только интервал [pos, размер()).

Только в том случае, когда множество имеет один символ, параметр равен CharT, эти две функции совпадают.