Я считаю, что поведение std::string::find
несовместимо со стандартными контейнерами C ++.
Например
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10); // it == myMap.end()
Но для строки,
std::string myStr = "hello";
auto it = myStr.find('!'); // it == std::string::npos
Почему бы не myStr.find('!')
вернуть неудачу myStr.end()
вместо std::string::npos
?
Поскольку std::string
он несколько особенный по сравнению с другими контейнерами, мне интересно, есть ли какая-то реальная причина этого. (Удивительно, но я не смог найти никого, кто бы это допрашивал).
std::string
внутренне состоит из символов, которые являются недорогими элементами (в отношении памяти). И, кроме того, символ - единственный тип, который std::string
может содержать. С другой стороны, std::map
состоит из более сложных элементов. Кроме того, спецификация std::map::find
говорит, что он должен найти элемент, а спецификация std::string::find
говорит, что его задача - найти позицию.