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::string
internamente consiste em caracteres que são elementos baratos (em relação à memória). Além disso, o caractere é o único tipo que std::string
pode conter. Por outro lado, std::map
consiste em elementos mais complexos. Além disso, a especificação de std::map::find
diz que é suposto encontrar um elemento, e a especificação de std::string::find
diz que sua tarefa é encontrar a posição.