标准模板库 standard template library
分类:
- 容器 container
 - 算法 algorithm
 - 迭代器 iterator
 
六大组件
- 容器:各种数据结构,比如vector,list,deque,set,map等,存放数据用
 - 算法:如sort,find,copy,for each
 - 迭代器:
 - 仿函数:行为类似函数
 - 适配器:修饰容器或者仿函数或迭代器接口的东西
 - 空间配置器
 
容器
- 序列式容器:强调值的排序,每个元素有固定的位置
 - 关联式容器:二叉树结构,没有严格的物理顺序关系
 
算法
- 质变算法:运算过程中会修改元素内容,如拷贝,替换,删除...
 - 非质变算法:不会改变元素内容,比如查找,计数...
 
迭代器
提供一种方法,能够依序访问容器内的各个元素,又无需暴露容器的内部表示方式
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*
 
- 
构造函数
string s1;//无参构造 const char* str="hello"; string s2(str); string s3(s2); string s4(5,'a'); //s4="aaaaa" - 
赋值操作
//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'); - 
字符串拼接
//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的三个字符 - 
字符串查找和替换
 
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
- 字符串比较
 
//按字符的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.[]
string s="aaa";
cout<<s[0]<<endl;
//2.at
cout<<s.at(0)<<endl;
s.at(0)='x;//xaa
- 插入和删除
 
string s="aa";
s.insert(1,"bb");//abba
str.erase(1,2);//aa,从位置1开始删除2个字符
- 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);

京公网安备 11010502036488号