我发现的行为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
与其他容器相比,它有些特殊,所以我想知道这背后是否有真正的原因。(令人惊讶的是,我找不到任何人在任何地方对此进行质疑)。
5
我认为只有一个合理的答案才是接近问题的答案:“为什么将热狗装在4个容器中,而热狗面包装在6个容器中?” 好吧,这就是世界的样子
—
-bartop
检查此内容
—
NutCracker
恕我直言,这种行为的原因是
—
NutCracker
std::string
内部由字符组成,这些字符是廉价的元素(就内存而言)。而且,字符是唯一std::string
可以包含的类型。另一方面,std::map
由更复杂的元素组成。另外,的规范std::map::find
说应该找到一个元素,而的规范std::string::find
说它的任务是找到位置。
对于map,您不能有npos迭代器,因此要使用end迭代器。对于字符串,我们可以使用npos,所以为什么不:)
—
LF