Я вважаю, що поведінка 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
говорить про те, що його завдання - знайти позицію.