请查看以下代码以更好地理解我的问题。
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;
我有一个维护键值对的映射,它们是指向字符串对象的指针。我确定键和值都不是 NULL 指针。当我运行上面的程序时(好吧,我跳过了周围的代码以使其更容易理解),“Added ... ...”被打印了 49 次。 ptr1[i]、ptr2[i] 是指向字符串对象的指针,不是 NULL 指针,因为我的程序没有段错误。
我遇到的问题是,当我最后打印 map 大小时,它说 map 中只有 1 个元素。
如果有人能给我指示以找到修复程序,我将不胜感激。提前致谢。
编辑:@Mark 解决方案对我来说很有魅力。谢谢
EDIT2:在看到来自@Mark 和@James 的宝贵反馈后,我认为我不需要在我的 map 中存储指向字符串的指针。我将更改我的代码以将字符串存储为键/值,这意味着我不需要自定义比较器仿函数。多谢。
最佳答案
你的比较器是错误的:if (s1 == s2)
must return false
并且比较器must产生一个 strict weak ordering .
[就其值(value)而言,使用指针类型作为 std::map
的键充其量是不寻常的。]
关于c++ - 插入 C++ 映射 STL 容器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627843/