【问题标题】:C++ map with custom comparator not inserting all elements [duplicate]具有自定义比较器的 C++ 映射未插入所有元素 [重复]
【发布时间】:2017-11-14 10:31:49
【问题描述】:

我创建了以下比较器来测试地图:

struct comparator{
    bool operatior() (int a,int b){
        return 1;
    }
}

然后是以下算法:

int main(){
    // imports string to currentString
       ...
    std::map<int,char> default_map;
    std::map<int,char,comparator> test_map;

    while(i < stringSize){
       if(currentString[i] == '(' || currentString[i] == ')'){
          default_map[i]=currentString[i];
          test_map[i]=currentString[i];
       }
    }

    auto currentIterator = default_map.begin();
    while(currentIterator != default_map.end()){
        printf("%d %c\n",currentIterator->first,currentIterator->second);
    }

    auto currentIterator = test_map.begin();
    while(currentIterator != test_map.end()){
         printf("%d %c\n",currentIterator->first,currentIterator->second);
    }

    return 0;
}

这里 default_map 打印所有括号,而带有自定义比较器的 test_map 只打印前两个括号。

这是地图代码中的错误吗? 我最初想将 class 作为带有自定义比较器的键,但它甚至不能使用自定义 int 键。

我的 make 文件确实使用了 -std=c++1y 标签,所以这可能会影响它吗? 我不知道该怎么办。我正在考虑看看 SGI 地图是否会比标准地图更好。

【问题讨论】:

    标签: c++ stl std comparator stdmap


    【解决方案1】:

    您需要正确实现比较功能。

    struct comparator{
        bool operatior() (int a,int b){
            return (a < b);
            // return 1;
        }
    }
    

    否则不符合map的key排序条件。

    【讨论】:

      【解决方案2】:

      您的“比较器”(“运算符”拼写错误)总是返回1。您如何期望它有效地确定地图中是否已经存在某些东西或其正确的顺序? (提示:不会)。

      您需要编写一个实际上以有用的方式比较元素的函数。

      比较函数需要实现strict weak ordering 才能在map 中使用。

      【讨论】:

      • 谢谢。我正在为比较器做这样的事情: if(a > b) return 1;否则如果 (a==b) 返回 0;否则返回 -1;
      • 如果两个元素相等会发生什么???我猜它只是切换 a 和 b 来检查。好的有道理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多