【发布时间】:2011-04-11 21:34:33
【问题描述】:
请查看以下代码以更好地理解我的问题。
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 指针,因为我的程序没有段错误。
我遇到的问题是,当我最后打印地图的大小时,它说地图中只有 1 个元素。
如果有人可以指导我找到解决方法,我将不胜感激。提前致谢。
编辑:@Mark 解决方案对我来说很有魅力。谢谢
EDIT2:在看到来自@Mark 和@James 的宝贵反馈后,我认为我不需要在我的地图中存储指向字符串的指针。我将更改我的代码以将字符串存储为键/值,这意味着我不需要自定义比较器仿函数。非常感谢。
【问题讨论】:
-
我还不知道答案,但你能用
return *s1 == *s2;替换compare行吗? -
我确实尝试过这个选项。它只打印一个元素。
-
哇...
compareByValue::operator()的实现保证了 DailyWTF 的发布。 o.O