std::地图.使用c-string进行计数不起作用
std::map.count using c-strings does not work?
我希望在性能情况下使用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::map
对char
指针没有特殊处理。它像对待任何其他类型的指针一样对待它们,而而不是像字符串一样对待它们,这意味着它只是将键与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
的必须是一个接受两个指针并返回第一个指针是否小于第二个指针的函子。您可以使用 strcmp
c函数。这应该能奏效:
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。
你好像在做你不想做的事。
- 我的神经网络不起作用 [XOR 问题]
- std::string == 运算符在代码中不起作用
- 为什么unordered_set<string::iterator>不起作用?
- 如何通过长度从 std::vector 中删除元素<string>(擦除不起作用)
- 将char转换为std::string不起作用
- 为什么 std::list<string> 有效,但 std::list <int>不起作用
- 为什么显式运算符 std::string 不起作用
- 为什么一个简单的bimap(std::string <-> int)不起作用?
- std::string 的函数指针的类型定义不起作用
- 字符串运算符 += 有时在 string::resize() 之后不起作用
- 为什么 getline() 在 C++ 中不起作用?(调用'getline(std::ofstream&, std::string&)'没有匹配函数
- 在 C++11 中初始化 std::vector<std::string>不起作用?
- QString到std::string到const char*的转换在赋值中不起作用
- std::地图.使用c-string进行计数不起作用
- 为什么我的读取矢量<矢量>的循环<string>不起作用?Linux C++
- 从 std::string 到类的隐式转换不起作用
- Compare string对cin不起作用
- <string> 矢量在使用单独的类时不起作用
- 为什么在 std::string 上重载"operator <<"不起作用?
- 使用 std::string.compare() 将不起作用