2017-09-05 102 views
0

Set是一个Sorted Associative Container,它存储Key类型的对象。 Set是一个简单关联容器,意思是它的值类型 及其关键类型是Key。这也是一个独特的联合容器,这意味着没有两个元素是相同的。无法使用对<int, int>作为C++中的键集STL

我试图建立一个set<pair<int, int>>与数字和它出现在字符串中的位置作为key

当试图插入pair<int, int>作为set的密钥时,当该对的第一个元素再次出现,虽然pair是唯一的,但插入未成功。

#include <iostream> 
#include <set> 
#include <iterator> 

using namespace std; 
struct compare 
{ 
    bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs) 
    { 
     return lhs.first > rhs.first; 
    } 
}; 
void print(set<pair<int, int>, compare> myset) 
{ 
    for(auto iter=myset.begin(); iter!=myset.end();++iter){ 
     cout << iter->first << ' ' << iter->second << endl; 
    } 
} 

void BuildSet(int num) 
{ 
    set<pair<int, int>, compare> values; 
    string number = to_string(num); 
    for(int i=0; i<number.size(); ++i) 
    { 
     int quot = number[i]-'0'; 
     values.insert(make_pair(quot, i)); 
    } 
    cout << endl; 
    print(values); 
    cout << endl; 
} 
int main() { 
    BuildSet(98738); 
} 

输出功率为:

9 0 
8 1 
7 2 
3 3 

随着失踪作为第一要素的进入8 4正在复制。

回答

0

原因很简单。

compare方法确实知道如何处理第一个元素已经存在于'set'中的情况。修改它以解决这个问题。

struct compare 
{ 
    bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs) 
    { 
     if(lhs.first != rhs.first) 
     { 
      return lhs.first > rhs.first; 
     } 
     else 
     { 
      return lhs.second > rhs.second; 
     } 
    } 
}; 

这里,pair的第一个元素进行比较的第一和在相等的情况下,而不是在较早的一个当只有第一元件相比,第二元件被选中。

+6

是的,你可以这样做。或者只是使用'std :: greater >' – StoryTeller

+0

@StoryTeller是的,这将是干净的做法。我添加了这个,以防任何人遇到写他们自己的“比较”方法。 – thebenman

+0

或者只是'lhs> rhs;' – juanchopanza

0

你可以使用函子:

greater<pair<int, int>>()

less<pair<int,int>>()

为CMP功能。 和#include<functional>

+0

'less '已经是'std :: set '的默认值,即使'T == std :: pair '。 – MSalters

相关问题