stl拾撷——set&map
一、操作
兼容auto等
tools-->compiler options-->"-std=c++11"
set,iterator
//reference: https://blog.csdn.net/sunshinewave/article/details/8068326
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
set<int> s;
set<int>::iterator first;
set<int>::iterator second;
//插入
for(int i = 1 ; i <= 10 ; ++i)
{
s.insert(i);
}
//第一种删除
s.erase(s.begin());
//第二种删除
first = s.begin();
second = s.begin();
second++;
s.erase(first,second);
//第三种删除
s.erase(8);
//判断是否在集合中
if (s.count(11)!=1) cout<<'N';
if (s.find(10)!=s.end()) cout<<'Y';
cout<<endl;
//第二种插入
int a[] = {1,2};//cout<<a[3]----> "3960616"
s.insert(a,a+2);
////最后的数据刚好是从1到10,中间只少了个8////
//反向输出
set<int>::reverse_iterator riter;
for(riter = s.rbegin() ; riter != s.rend() ; ++riter)
{
cout<<*riter<<" ";
}
cout<<endl;
//正向输出
for(auto iter = s.begin();iter != s.end(); ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
int b[8]={4,10,11,12,69,70,96,100};
int low=lower_bound(b,b+8,11)-b;//>=
int up=upper_bound(b,b+8,11)-b;//>
cout<<low<<up<<endl;
return 0;
}
map,pair
//reference: https://blog.csdn.net/wu_lai_314/article/details/8440550
#include <iostream>
#include <algorithm>
#include <string>
#include <utility>
#include <map>
using namespace std;
int main()
{
map<string,int> s;
map<string,int>::iterator iter;
s["one"]=1;
pair<string,int> couple("two",3);
couple.second=2;
s.insert(couple);
for(iter = s.begin(); iter != s.end(); iter++)
cout<<iter->first<<" "<<iter->second<<endl;
cout<<s["one"]<<endl;
iter = s.find("two");
cout<<iter->first<<" "<<iter->second<<endl;
iter = s.find("three");
if (iter==s.end()) cout<<"404"<<endl;
return 0;
}
二、map的题
路径压缩题。
若对象是整数,可用并查集。不是,可用map
设s1改名为s2,此时map[s1]=s2.然后s2又改名为s3
直接思路是查找s2(值)是否出现过,若是,将s2(值)对应的s1(关键字)的值改为s3.但这样遇到的障碍是我们没有快速查找map中给定的值有无出现过的方法。
妙在逆向思维。我们颠倒过来令map[s2]=s1,问题解决。
http://codeforces.com/problemset/problem/4/C
对于abacada1,本质是abacada重复了1次,并不是真的顺着题目的意思生成额外带数字的昵称。统计个数,仅此而已。