请参阅以下代码以更好地理解我的问题.
class compareByValue {
public:
bool operator()(const string* s1, const string* s2) const
{
if (s1 == s2)
return true;
if ((s1==NULL) || (s2==NULL))
return false;
return (0 == s1->compare(s2->c_str()));
}
};
map<string*, string*, compareByValue> nodeIdToIpAddress;
for (int i = 0; i < nrec; ++i) {
nodeIdToIpAddress[ptr1[i]] = ptr2[i];
cout << "Added " << *(ptr1[i]) << " , " << *(ptr2[i]) << endl;
}
cout << "map has " << nodeIdToIpAddress.size() << " elements!" << endl;
Run Code Online (Sandbox Code Playgroud)
我有一个地图,维护键,值对,它们是指向字符串对象的指针.我确信键和值都不是NULL指针.当我运行上面的程序(好吧,我跳过周围的代码以使其更容易理解),"添加......"被打印49次.ptr1 [i],ptr2 [i]是字符串对象的指针,不是NULL指针,因为我的程序不会发生段错误.
我遇到的问题是,当我在最后打印地图的大小时,它表示地图中只有1个元素.
如果有人能给我指示找到解决办法,我将不胜感激.提前致谢.
编辑:@Mark解决方案对我来说很有魅力.谢谢
编辑2:在看到来自@Mark和@James的有价值的反馈后,我想我不需要在地图中存储指向字符串的指针.我将更改我的代码以将字符串存储为键/值,这意味着我不需要自定义比较器仿函数.非常感谢.
你的比较器是错误的: if (s1 == s2) 必须返回false并且比较器必须产生严格的弱序.
[对于它的价值,使用指针类型作为a的关键std::map是最常见的.]