STL

STL总结

1.string

string可以完成一下几个功能

1:拼接字符串

    string a="Fuck",b=" You",c=a+b;
    // c="Fuck You";

2:在指定位置插入字符串

    string c="Fuck You";
    c.insert(0,"I ");
    c.insert(10," Man!");
    // c="I Fuck You Man!
"

3.进行字符串排序(默认升序)

1:字符内排序
	a="I Fuck It";
	sort(a.begin(),a.end());
	/*
	    输出
          FIIcktu(前面有两个空格)
	*/
2:数组中排序
	a[0]="I Fuck It";
	a[1]="She Fuck It";	
	a[2]="I Fuck He";
	a[3]="I Fuck She";
	a[4]="He Fuck It";
	sort(a,a+5);
	/*
	    输出
	    He Fuck It
        I Fuck He
        I Fuck It
        I Fuck She
        She Fuck It
	*/

2.map

//用map的迭代器遍历的时候,是以第一个类型为关键字的排序
    map<string,int> Map;
	Map["I Fuck It"]=3;
	Map["I Fuck He"]=1;
	Map["I Fuck She"]=2;
	map<string,int>::iterator iter;
	for(iter=Map.begin();iter!=Map.end();iter++) {		
		string A=iter->first;
		int sum=iter->second;
		cout<<A<<' '<<sum<<endl;
	}
	/*
	    输出
	    I Fuck He 1
        I Fuck It 3
        I Fuck She 2
	*/

3.vector

https://www.luogu.org/problemnew/show/P3369


    1.插入 xxx 数
    2.删除 xxx 数(若有多个相同的数,因只删除一个)
    3.查询 xxx 数的排名(排名定义为比当前数小的数的个数 +1+1+1 。若有多个相同的数,因输出最小的排名)
    4.查询排名为 xxx 的数
    5.求 xxx 的前驱(前驱定义为小于 xxx ,且最大的数)
    6.求 xxx 的后继(后继定义为大于 xxx ,且最小的数)

    v.reserve(100001); //要求vector的容量至少能够容纳n个元素
    while(n--)
    {
        scanf("%d%d",&opt,&x);
        if(opt==1)    v.insert(lower_bound(v.begin(),v.end(),x),x);
        if(opt==2)    v.erase (lower_bound(v.begin(),v.end(),x));
        if(opt==3)    printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+1);
        if(opt==4)    printf("%d\n",v[x-1]);
        if(opt==5)    printf("%d\n",v[lower_bound(v.begin(),v.end(),x)-v.begin()-1]);
        if(opt==6)    printf("%d\n",v[upper_bound(v.begin(),v.end(),x)-v.begin()]);
    }
	vi.push_back(2);
	vi.push_back(3);
	vi.push_back(1);
	vi.push_back(4);	

	for(int i=0; i<=4; ++i) cout<<vi[i]<<' ';
	cout<<endl;

	vi.insert(vi.begin()+2,6);
	for(int i=0; i<=5; ++i) cout<<vi[i]<<' ';
	cout<<endl;

	sort(vi.begin(),vi.end());
	for(int i=0; i<=5; ++i) cout<<vi[i]<<' ';
	cout<<endl;
	
	vi.insert(lower_bound(vi.begin(),vi.end(),5),5);
	for(int i=0; i<=6; ++i) cout<<vi[i]<<' ';
	cout<<endl;	
	// lower_bound 大于等于这个数的最小位置
	// upper_bound 严格大于这个数的最小位置
	for(int i=1; i<=n; ++i) a[i]=i*2;
	cout<<lower_bound(a+1,a+1+n,8)-a<<endl;
	cout<<upper_bound(a+1,a+1+n,8)-a;
        // 输出 
                    4
                    5

4.set

1.基本操作

    set <int> s;
    set <int>::iterator it;
    s.insert(20);
    it=s.find(20);  
    if(it!=s.end()) cout<<*it<<endl;  
    else  cout<<"not find it"<<endl;  

2.遍历

for(it = s.begin(); it != s.end(); it++) cout << *it << " ";  

3.自定义比较函数

struct node {  
	int val;
	bool operator<(const node &a)const{return a.val<val;}  
};  
set <node> s;

5.bitset

https://www.luogu.org/problemnew/show/P3674

    bitset <10> a(string("0011010")); //建立一个大小为10的bitset
    cout<<a<<endl;//0000011010
    bitset <10> b(string("100100110"));
    cout<<b<<endl;//0100100110
    cout<<(a&b)<<endl;//0000000010
    cout<<(a|b)<<endl;//0100111110
    cout<<(a^b)<<endl;//0100111100
    cout<<(a<<1)<<endl;//0000110100
    cout<<(a>>1)<<endl;//0000001101
    cout<<(a.size())<<endl;//返回bitset的位数:10
    cout<<(a.count())<<endl;//返回1的个数:3
    cout<<(a.any())<<endl;//返回是否有1:1
    cout<<(a.none())<<endl;//返回是否无1:0
    a.set();cout<<a<<endl;//全部变成1:1111111111
    a.reset();cout<<a<<endl;//全部变成0:0000000000
    a.set(3);cout<<a<<endl;//将第3位(从0开始计算)变成1:0000001000
    a.reset(3);cout<<a<<endl;//将第3为变成0:0000000000
    b.flip();cout<<b<<endl;//将b全部取反:1011011001
    b.flip(2);cout<<b<<endl;//将第2位取反:1011011101
    b[9]=0;cout<<b<<endl;//访问第9位:0011011101
    unsigned int num=b.to_ulong();//将bitset转化成usigned int
    cout<<num<<endl;//221
posted @ 2018-06-06 21:20  TPLY  阅读(57)  评论(0编辑  收藏
free web counter
free web counter