2017-06-12 38 views
-4

我已经创建了下列比较测试图的所有元素:C++地图定制比较器不插入

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

则以下algorthim:

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仅打印前两个括号。

这是地图代码中的错误吗? 我原本想用自定义比较器将类作为键,但它甚至没有使用自定义int键。

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

回答

1

您的“比较器”(拼写错误的“运算符”)始终返回1。您如何期望有用地确定地图中是否已有东西或其正确的排序? (提示:不会)。

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

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

+0

谢谢。我为比较器做了这样的事情: if(a> b)return 1; else if(a == b)return 0; else return -1; – Henrickunit

+0

那么如果两个元素相等会发生什么?我想它只是切换a和b来检查。好吧有道理。 – Henrickunit

1

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

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

否则,它不符合排序映射键的标准。