无法使用pair <int,int =“”>作为C ++ STL中set的键

时间:2017-09-05 05:14:19

标签: c++ stl set std-pair

  

Set是一个Sorted关联容器,用于存储Key类型的对象。   Set是一个简单的关联容器,意味着它的值类型为   以及它的关键类型是Key。它也是一个独特的联想   容器,意味着没有两个元素是相同的。

我正在尝试构建一个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丢失。

2 个答案:

答案 0 :(得分:0)

原因很简单。

compare方法确实知道在第一个元素已经存在于&#39; 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的第一个元素,如果相等,则检查第二个元素,而不检查第一个元素。

答案 1 :(得分:0)

你可以使用仿函数:

greater<pair<int, int>>()

less<pair<int,int>>()

作为cmp函数。 并#include<functional>