Acho que o comportamento std::string::findé inconsistente com os contêineres C ++ padrão.
Por exemplo
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10); // it == myMap.end()
Mas para uma corda,
std::string myStr = "hello";
auto it = myStr.find('!'); // it == std::string::npos
Por que a falha não deveria myStr.find('!')retornar em myStr.end()vez de std::string::npos?
Como o std::stringé um pouco especial quando comparado com outros contêineres, estou me perguntando se há alguma razão real por trás disso. (Surpreendentemente, eu não consegui encontrar ninguém questionando isso em lugar nenhum).
std::stringinternamente consiste em caracteres que são elementos baratos (em relação à memória). Além disso, o caractere é o único tipo que std::stringpode conter. Por outro lado, std::mapconsiste em elementos mais complexos. Além disso, a especificação de std::map::finddiz que é suposto encontrar um elemento, e a especificação de std::string::finddiz que sua tarefa é encontrar a posição.