【发布时间】:2020-02-14 05:41:17
【问题描述】:
我发现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 与其他容器相比有些特殊,我想知道这背后是否有一些真正的原因。
(令人惊讶的是,我在任何地方都找不到任何人对此提出质疑)。
【问题讨论】:
-
我认为只有合理的答案才接近于回答以下问题:“为什么热狗是 4 个包装,热狗面包是 6 个包装?”嗯,这就是世界的本来面目
-
检查this
-
恕我直言,这种行为的一个原因是
std::string内部由廉价元素的字符组成(就内存而言)。此外,字符是std::string可以包含的唯一类型。另一方面,std::map包含更复杂的元素。此外,std::map::find的规范说它应该找到一个元素,std::string::find的规范说它的任务是找到位置。 -
对于 map,不能有 npos 迭代器,所以使用 end 迭代器。对于字符串,我们可以使用 npos,为什么不呢:)
标签: c++ stdstring c++-standard-library