插入到c ++ map STL容器失败

Sri*_*nth 0 c++ stl map

请参阅以下代码以更好地理解我的问题.

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的有价值的反馈后,我想我不需要在地图中存储指向字符串的指针.我将更改我的代码以将字符串存储为键/值,这意味着我不需要自定义比较器仿函数.非常感谢.

Jam*_*lis 6

你的比较器是错误的: if (s1 == s2) 必须返回false并且比较器必须产生严格的弱序.

[对于它的价值,使用指针类型作为a的关键std::map是最常见的.]

  • 此外,使用这种更复杂的方法,即使你的内存管理正确,你仍然可能正在做同样多的动态分配(如果不是更多),因为你有两个动态分配:一个用于`std :: string`本身和`std :: string`中的一个用于缓冲区.如果你有一个移动感知标准库(最新版本的libstdc ++,Visual C++ 2010等),你将会做_more_工作.除非你已经分析了这部分代码并确定它实际上是一个性能瓶颈并且使用指针确实有利于性能,否则我会避免使用指针 (2认同)