set中嵌套pair进行混合使用
1)出错代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<pair<int,int> > tt;
//数字个数,数字
pair<int,int> a;
a.first=3;
a.second=5;
tt.insert(a);
pair<int,int> b;
b.first=1;
b.second=99;
tt.insert(b);
set<pair<int,int> >::iterator it;
it=tt.find(b);
printf("%d %d\n",it->first,it->second);
it++;
printf("%d %d",it->first,it->second);
//---出错的地方---
it->first=(it->first)+1;
printf("%d %d",it->first,it->second);
return 0;
} [Error] assignment of member 'std::pair<int, int>::first' in read-only object
尝试直接修改map中某个pair的key时给出的报错。由报错可知,pair对应的key应当是只读的。因此,可以先删掉该pair,然后再插入一个符合要求的pair。
2)可以用的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<pair<int,int> > tt;
//数字个数,数字
pair<int,int> a;
a.first=3;
a.second=5;
tt.insert(a);
pair<int,int> b;
b.first=1;
b.second=99;
tt.insert(b);
set<pair<int,int> >::iterator it;
//注意,查找要写set中的元素类型,而不能仅仅根据second查询等
it=tt.find(b);
printf("%d %d\n",it->first,it->second);
it++;
printf("%d %d\n",it->first,it->second);
pair<int,int> temp;
temp.first=(it->first)+1;
temp.second=it->second;
tt.insert(temp);
tt.erase(it); //注意这里,迭代器失效了
it=tt.find(temp);
printf("%d %d\n",it->first,it->second);
it--;
printf("%d %d\n",it->first,it->second);
return 0;
} 输出
1 99 3 5 4 5 1 99
注意,set底层是“红黑树”,并且是以为pair的first进行排序的,set去重了

京公网安备 11010502036488号