标准模板库 standard template library

分类:

  • 容器 container
  • 算法 algorithm
  • 迭代器 iterator

六大组件

  1. 容器:各种数据结构,比如vector,list,deque,set,map等,存放数据用
  2. 算法:如sort,find,copy,for each
  3. 迭代器:
  4. 仿函数:行为类似函数
  5. 适配器:修饰容器或者仿函数或迭代器接口的东西
  6. 空间配置器

容器

  • 序列式容器:强调值的排序,每个元素有固定的位置
  • 关联式容器:二叉树结构,没有严格的物理顺序关系

算法

  • 质变算法:运算过程中会修改元素内容,如拷贝,替换,删除...
  • 非质变算法:不会改变元素内容,比如查找,计数...

迭代器

提供一种方法,能够依序访问容器内的各个元素,又无需暴露容器的内部表示方式

vector

	#include<vector>
    #include<algorithm>
    
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    
    vector<int>::iterator itBegin=v.begin();
    vector<int>::iterator itEnd=v.end();//指向容器中最后一个元素的后一个地址
    //遍历数组1
    while(itBegin!=itEnd){
    	cout<<*itBegin<<end;//把迭代器当指针用
        itBegin++;
    }
    
    //遍历数组2
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
    	cout<<*it<<end;
    }
    
    //遍历数组3,利用stl中的算法
    void myprint(int val){
    	cout<<val<<endl;
    }
    for_each(v.begin(),v.end(),myprint);

vector中存放自定义数据内容

    class Person{
    public:
    	Person(string name,int age){
        	this.name=name;
            this.age=age;
        }
        string name;
        string age;
    }
    
    void test1(){
    	vector<Person>v;
        Person p1("a",10);
        Person p2("b",20);
        v.push_back(p1):
        v.push_back(p2);
    }
    //存放容器地址
    void test2(){
    	vector<Person*>v;
        Person p1("a",10);
        Person p2("b",20);
        v.push_back(&p1):
        v.push_back(&p2);
        
        for(vector<Person*>::iterator it=v.begin();it!=v.end();it++){
    	cout<<(*it)->name<<end;
    }
    }

容器嵌套容器

    vector<vector<int>> v;
    for(vector<vector<int>>::iterator it=v.begin();it!=v.end();it++){
    	for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++){
        	cout<<*vit;
        }
        cout<<endl;
    }
    
    

string

string和char*的区别:

  • char* 是一个指针
  • string是一个类,内部封装了char*
  1. 构造函数

     string s1;//无参构造
     
     const char* str="hello";
     string s2(str);
     
     string s3(s2);
     
     string s4(5,'a');
     //s4="aaaaa"
    
  2. 赋值操作

     //1.
     string s1;
     s1="hello";
     
     //2.
     string s2;
     s2=s1;
     
     //3. 
     string s4;
     s4.assign("hhhhh");
     
     //4. 
     string s5;
     s5.assign("hhhhhh",3);
     //s5="hhh"
     
     //5.
     string s6;
     s6.assign(str5);
     
     //6.
     string s7;
     s7.assign(10,'w');
    
  3. 字符串拼接

     //1.
     string s1="i";
     s1+="am c";
     
     //2.
     s1+='c';
     
     //3.
     string s2=" hhh";
     s1++=s2;
     
     //4.
     string s3="111";
     s3.append("lock");
     s3.append("helloooo",5);
     s3.append(s1);
     s3.append(s1,0,3);//从0开始截取s1的三个字符
     
    
  4. 字符串查找和替换

string s1="abcdefg";
int pos1=s1.find("d");
int pos2=s.find("d",3);//从位置为3开始查找
if(pos2==-1){
	cout<<"not found"<<endl;
}

string s="abcdefgd";
int pos3=s1.rfind("d");//7
//rfind是从右往左开始查找

string s3="abcdefg";
s3.replace(1,3,"11111");//替换结果为a11111g,从一号位置起,五个字符被替换1
  1. 字符串比较
//按字符的ascii码去逐个对比
string s1="gg";
string s2="hh";
if(s1.compare(s2)==0){
	cout<<"相等"<<endl;
}
else if(s1.compare(s2)>0){
	cout<<"s1大"<<endl;
}else cout<<"s2大"<<endl;
  1. 字符存取
//1.[]
string s="aaa";
cout<<s[0]<<endl;
//2.at
cout<<s.at(0)<<endl;
s.at(0)='x;//xaa
  1. 插入和删除
string s="aa";
s.insert(1,"bb");//abba
str.erase(1,2);//aa,从位置1开始删除2个字符
  1. string子串
string s="abcd";
string subs=s.substr(1,3);//bcd,从1开始截取3个

string email="xxx@163.com";
int pos=email.find("@");
string name=email.substr(0,pos);