string
######################## 构造 ############################
string s1;//默认构造
const char * str = "hello world";//通过字符串构造
string s2(str);
string s3(s2);//复制构造
########################## 赋值 #############################
string str1;//赋值方法
str1 = "hello world";
########################## 拼接 #############################
string s1="我";
s1 +="是帅哥"
s1.append("是帅哥");
s2="12345";
s1.append(s2,0,2);//s1变为“我123”
########################## 查找和替换 #############################
string s1 ="abcdef";
int pos = find("ab");//find返回子串位置坐标,没有则返回-1
s1.replace(1,3,111);
########################## 取值和插入删除 #############################
s1[0];
s1.size();
s1.insert(1,"111");
s1.erase(1,"111");
########################## 子串获取 #############################
string sub_str = s1.sunstr(1,3);
vector 向量
######################## 构造 ############################
vector<int> v1;//默认构造
for(int i=0;i<10;i++)
{
v1.push_back(i)
}
v1(v2)//复制构造
v2=v1;
######################## 赋值 ############################
v1.push_back(i);
######################## 容量 ############################
int cap = v1.capacity();//返回v1的容量
int size =v1.size();//返回v1的size
v1.resize(15);
######################## 插入和删除 ############################
v1.push_back();//在末尾插入
v1.pop_back();//在尾部进行删除
v1.insert(v1.begin(),100);//insert()方法需要迭代器
v1.erase(v1.begin(),v1.end());//删除[begin,end)之间的数据
######################## 取值 ############################
v1[1];//下标取值
v1.size();
v1.front();//取第一个元素
v1.back();//取最后的元素
######################## 交换容器和预留空间 ############################
假设v1的大小是10000,容量是3
deque 双端向量
deque和vector类似,可以使用sort()算法进行排序,在algorithm包中,支持随机访问的算法如vector和deque都可以用sort()排序
#include<algorithm>
deque<int> d;
sort(d.begin(),d.end());
stack 栈
stack<int> s;
s.push(2);
s.pop(2);
s.top();//返回栈顶
s.empty();//判断栈是否为空
s.size();//返回栈的大小
queue 队列
queue<int> q;
q.push(1);
q.pop(1);
q.back();//取队尾
q.front();//取队头
q.empty();
q.size();
list 链表
STL中的链表为双向链表,每个节点会记录前一个结点和后一个结点的位置,list的迭代器只能一个一个往前或者往后移动不支持跳跃式访问,list不支持[ ]取值
list不支持随机访问,所以不能用标准算法algorithm中的sort()排序,但是它自身自带了函数sort()
当list中为自定义类型时,如自定义的person类,需要给sort()传入排序函数compare,其返回值为bool
list<int> lis;
lis.remove(a);//移除所有值为a的元素
lis.reverse();//链表反转
//当list中为int类型时,可以直接使用sort()排序
lis.sort();
//当list中为自定义类型时,如自定义的person类,需要给sort()传入排序函数compare,其返回值为bool
//先按照年龄排序,年龄相同按照身高排序
bool compare(Preson &p1,Person &p2)
{
if(p1.age==p2.age)
{
return p1.heigh>p2.heigh;
}
return p1.age>p2.age;
}
set
set属于关联式容器,插入新元素后自动会排好序,不允许重复的值,即使插了重复的不会报错但是没用仍然只会有一个
set使用find查找,找到的话返回一个该元素位置的迭代器,未找到返回set.end()
set不允许有重复元素,multiset允许有重复
set<int> s;
s.insert(1);
######################## 查找 ############################
set<int>::iterator pos = s.find(5);
if(pos!=s.end())
{
cout<<“找到元素”<<endl;
}
else{
cout<<”未找到元素<<endl;
}
set改变排序方式:使用仿函数,在set定义之前传入仿函数改变其排序方式
仿函数的本质上是一个类型
class MyCompare
{
public:
bool operator()(const Person&p1,const Person&p2)//重载()
{
return p1.age>p2.age?;
}
}
set<int,MyCompare>s2;
map
map的每个元素都是pair对组类,构建map时需要插入pair
//构造
map<int,int> m;
m.insert(pair<int,int>(1,10));
m.insert(pair<int,int>(2,20));
//输出
for(map<int,int>::iterator it =m.begin();it!=m.end();it++ )
{
cout<<"key=="<<((*it).first)<<"value="<<((*it).second);
}
//插入和删除,查找,排序
m.insert(pair<int,int>(1,10));
m.insert(make_pair(2,10));
m.erase(key);//按照key删除
m.find(key);//按照key查找
//