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
丢失。
答案 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>