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中是否含有某元素
|