c++ - 插入 C++ 映射 STL 容器失败

标签 c++ stl dictionary

请查看以下代码以更好地理解我的问题。

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/

相关文章:

c++ - 使用 cmake 在调试构建期间为单个项目指定发布

c++ - 如何从文本文件中输出数据? (学生成绩单计划)

java - Entity Beans 不允许定义 Map<String, Object> 属性

c++ - 无法将参数 1 从派生指针转换为基类指针引用

c++ - istringstream "get"方法实现

C++ large deque - 程序需要很长时间才能退出?

C++ 容器的迭代器

c++ - 在对对象的 vector 进行排序时使用 stable_sort

c++ - 字符数组作为 C++ 映射中的值

c# - 在 C# Dictionary<string,bool> 中设置所有值的最佳方式是什么?