Uważam zachowanie std::string::find jest niespójne ze standardowymi kontenerami C ++.
Na przykład
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10); // it == myMap.end()
Ale dla sznurka
std::string myStr = "hello";
auto it = myStr.find('!'); // it == std::string::npos
Dlaczego zamiast nieudanego myStr.find('!')powrotu ?myStr.end()std::string::npos
Ponieważ std::stringjest to coś specjalnego w porównaniu z innymi pojemnikami, zastanawiam się, czy jest jakiś prawdziwy powód tego. (Zaskakujące, nigdzie nie znalazłem nikogo, kto by to kwestionował).
std::stringwewnętrznie składają się z znaków, które są niedrogimi elementami (pod względem pamięci). Co więcej, charakter jest jedynym typem, który std::stringmoże zawierać. Z drugiej strony std::mapskłada się z bardziej złożonych elementów. Ponadto specyfikacja std::map::findmówi, że ma znaleźć element, a specyfikacja std::string::findmówi, że jego zadaniem jest znalezienie pozycji.