std::地图.使用c-string进行计数不起作用

std::map.count using c-strings does not work?

本文关键字:不起作用 c-string 地图 使用 std      更新时间:2023-10-16

我希望在性能情况下使用c-string而不是std::string。我有以下代码:

std::map<const char*, int> myMap;
.
.
.
myMap.insert(std::pair<const char*, int>(str.c_str(), myint));
std::cout << myMap.count(str.c_str()) << std::endl;

奇怪的是,我刚刚输入的值对于count()返回0 ?

默认情况下,std::map使用std::less来比较键(这与<相同,实际上,除了它保证也可以在不相关的指针上工作)。这意味着它只做指针比较,绝对不是你想要的。

只要使用c++ 11字符串类型(std::string),而不是用于空终止字符串的旧类型(const char*),就可以了。

为什么你认为使用原始C字符串会提高性能?

无论如何,std::mapchar指针没有特殊处理。它像对待任何其他类型的指针一样对待它们,而而不是像字符串一样对待它们,这意味着它只是将键与std::less进行比较。可能令人困惑的是,这与c++流的行为不同,当传递char const *时,c++流的行为会以一种特殊的方式进行。

你会得到同样的行为,如std::map<double *, int>, std::map<long *, int>std::map<MyClass *, int>。有趣的是,指针比较是有效的,因为std::less保证与指针一起工作,尽管与<的指针比较在形式上是未指定的行为。

因此,显然您对直接比较指针值不感兴趣。如果需要按字典顺序比较字符串,可以通过第三个模板参数指定映射的比较:

std::map<char const *, int, RawPointerComparion>

我在本例中称为RawPointerComparison的必须是一个接受两个指针并返回第一个指针是否小于第二个指针的函子。您可以使用 strcmpc函数。这应该能奏效:

struct RawPointerComparison
{
    bool operator()(char const *lhs, char const *rhs) const
    {
        return strcmp(lhs, rhs) < 0;
    }
};

似乎您使用变量str在映射中输入不同的字符串。例如

str = "first";
myMap.insert( { str.c_str(), 1 } );
str = "second";
myMap.insert( { str.c_str(), 2 } );
str = "first";
std::cout << myMap.count(str.c_str()) << std::endl;

在这种情况下,第一个str.c_str()不等于最后一个str.c_str()(在这里比较指针与已分配的字符串),因为在这些情况下分配了不同的内存区域。

如果你想做以下事情

str = "first";
myMap.insert( { str.c_str(), 1 } );
std::cout << myMap.count(str.c_str()) << std::endl;

如果没有中间语句,那么结果将是输出1。

你好像在做你不想做的事。