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去重了