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