vector

初始化

1
2
3
4
vector<int> a(10); //没有给出初值,其值是不确定的
vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
int b[7]={1,2,3,4,5,9,8};  vector<int> a(b,b+7); //从数组中获得初值

常用操作

1
2
3
4
5
6
a.back(); //返回a的最后一个元素
a.front(); //返回a的第一个元素
a.pop_back(); //删除a向量的最后一个元素
a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
a.size(); //返回a中元素的个数;
a.clear(); //清空a中的元素

重要算法

1
2
3
sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,
find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

误区

1
2
3
4
vector<int> a;
for(int i=0;i<10;i++)
    a[i]=i;
//这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素,而现在的a[i]还是空的对象

pair

定义

1
2
3
pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

string

string和int互转

1
2
3
string pi = "pi is " + to_string(3.1415926);
string s = "12"; 
int a = atoi(s.c_str());

初始化

1
2
string s1; //默认值是""
string s4 (5, 's'); //"sssss"

string 字符串的增删改查

1
2
3
4
s1 = s2 = "1234567890";
s3 = "aaa";
s1.insert(5, s3); //12345aaa67890 
//pos 表示要插入的位置,也就是下标;str 表示要插入的字符串,它可以是 string 字符串
1
2
3
4
string s1, s2, s3;
s1 = s2 = s3 = "1234567890";
s2.erase(5);       //12345
s3.erase(5, 3);    //1234590   3表示len
1
2
3
string s1 = "first second third";
string s2;
s2 = s1.substr(6, 6); //second  6表示len
1
2
3
4
5
6
7
8
string s1 = "first second second third";
string s2 = "c";
s1.find(s2);    //8
s1.find(s2,10); //15 从第十个位置开始找
s1.rfind(s2); //15 //从右边开始找
s1.find(s2,10); //8

返回的值都是数组下标

stack

常用操作

1
2
3
4
5
6
7
stack<int> q;	//以int型为例
int x;
q.push(x);		//将x压入栈顶
q.top();		//返回栈顶的元素
q.pop();		//删除栈顶的元素
q.size();		//返回栈中元素的个数
q.empty();		//检查栈是否为空,若为空返回true,否则返回false

queue

常用操作

1
2
3
4
5
6
7
8
queue<int> q;	//以int型为例
int x;
q.push(x);		//在末尾加入一个元素
q.pop();		//删除第一个元素
q.front();		//返回第一个元素
q.back();		//返回最后一个元素
q.size();		//返回队列中元素的个数
q.empty();		//如果队列空则返回真

priority_queue

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。它本质是一个堆实现的。

定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。

当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。

大根堆 大到小 用less

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;  0 1 2 3 4
//降序队列,大顶堆,默认
priority_queue <int,vector<int>,less<int> >q;  4 3 2 1 0
基本操作
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容

规则:pair的比较,先比较第一个元素,第一个相等比较第二个。

1
priority_queue<pair<int, int> > a;

deque

1
2
3
4
5
6
7
deque<int> d1;
d1.push_back(10);//在容器尾部添加一个数据
d1.push_front(30);//在容器头部添加一个数据
d1.pop_back(); /* 删除最后的元素 */
d1.pop_front(); /* 删除最前面的元素 */
front();//返回第一个数据。
back();//返回最后一个数据

map

unordered_map 相当于HashMap

map相当于java中的TreeMap

unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储(用红黑树实现)

1
2
3
4
5
6
size     返回有效元素个数 
insert    插入元素 
erase   删除元素
count      返回匹配给定主键的元素的个数 
for (auto x: map)
    cout << x.first << ": " << x.second << endl;

set

unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会

1 容量函数 容器大小:st.size(); 容器判空:st.empty(); 查找键 key 的元素个数:st.count(key);

2 添加函数 在容器中插入元素:st.insert(const T& x); 任意位置插入一个元素:st.insert(iterator it, const T& x);

3 删除函数 删除容器中值为 elem 的元素:st.pop_back(const T& elem); 删除it迭代器所指的元素:st.erase(iterator it); 清空所有元素:st.clear();

4 访问函数 st.find(key); 查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()

1
st.find(s[i]) != st.end() //判断set中是否含有某元素