标准模板库 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);