一、vector变长数组
1.读入方法
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> a;//直接读入一个名为a的vector
vector<int> a(10);//读入一个长为10的名为a的vector
vector<int> a(10, 2);//读入一个长为10的,每个数都为2的名为a的vector
vector<int> a[10];//读入10个vector
}
2.常用函数
部分函数如下:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> a;//直接读入一个名为a的vector
a.size();//a的元素个数,O(1)
a.empty();//a是否为空,是返回true,否返回false,O(1)
a.clear();//清空(队列没有)
a.front();//返回首位元素
a.back();//返回末位元素
a.push_back();//在末尾插入新数
a.pop_back();//删掉末位元素
a.begin();//迭代器首位
a.end();//迭代器末位的下一位
}
3、迭代器
迭代器it可视为指针,*it为地址为it的数值,利用迭代器遍历一个vector方法如下:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;//直接读入一个名为a的vector
for (int i = 0; i < 10; i++) a.push_back(i);
vector<int>::iterator it;//迭代器
for (it = a.begin(); it != a.end(); it++) cout << *it << " ";
cout << endl;
return 0;
}
4.C++11的新特性auto
auto可以自动识别变量的类型,适合类型很长的变量(如迭代器)的声明,还可用于for循环遍历,格式为for(auto x: a),代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;//直接读入一个名为a的vector
for (int i = 0; i < 10; i++) a.push_back(i);
for (auto it = a.begin(); it != a.end(); it++) cout << *it << " ";
cout << endl;
for(auto x : a) cout << x << " ";
cout << endl;
return 0;
}
5.其他
①系统为某一程序分配空间时,所需时间与空间大小无关,而与申请次数有关。
举个例子,你申请一个长度为1的vector和长度为100的vector所用时间是一样的,而你申请1000遍长度为1的vector时间是申请一次长度为1000的vector的时间的1000倍!
所以,我们要尽量减少申请vector的次数!
②同时,vector还可以比较大小,按照的是字典序。
二、二元组pair
1.定义
pair<类型,类型> 变量名;//两个类型可以不同
2.初始化方式
pair<int, string> p;
p = make_pair(5, "ok");//一般这样初始化
p = {5, "ok"};//C++11可以这么初始化
3.取元素
fir = p.first;//取第一个元素
sec = p.second;//取第二个元素
4.其他
①pair类型也是可以比较大小的,以first为第一关键字,second为第二关键字,按字典序比较。
②pair是可以存三种类型的,方法如下:
pair<int, pair<int, int>> p;
三、string
1.substr()子串函数
此函数有两个参数,第一个参数是子串的起始点(谨记字符串首位是从0开始的),第二个参数是子串的输出长度。若此长度大于原字符串子串的起始点后面的长度,或省略第二个参数,则输出起始点至后面的所有字符。
注:string拼接可以直接“+”即可。
string a;
a = "abc";
a += "de";
a += "f";
cout << a << endl;
cout << a.substr(1, 3) << endl;
cout << a.substr(1, 100) << endl;
cout << a.substr(1) << endl;
输出结果:
2.c_str()函数
该函数返回string的起始地址,可用于printf输出整个string(printf本身无法直接输出string)。
printf("%s\n", a.c_str());
3.其他常用函数
string a;
a.size();//返回string元素个数
a.length();//同上
a.empty();//返回string是否为空
a.clear();//把string清空
四、queue队列
1.特性
先进先出。
2.常用函数
queue<int> a;
a.size(); //这个队列的长度
a.empty(); //返回这个队列是否为空
a.push(); //往队尾插入一个元素
a.front(); //返回队头元素
a.back(); //返回队尾元素
a.pop(); //把队头弹出
注:queue没有clear函数!!!
那应该怎么清空队列呢?
只要重新定义一遍queue即可,如下:
queue<int> a;
a = queue<int>();
五、stack栈
1.特性
先进后出。
2.常用函数
stack<int> s;
s.size(); //这个栈的长度
s.empty(); //返回这个栈是否为空
s.push(); //向栈顶插入一个元素
s.top(); //返回栈顶元素
s.pop(); //弹出栈顶元素
六、双端队列deque
1.特性
两端都可以进和出,很方便,但是运行时间很慢。
2.常用函数
deque<int> d;
d.size(); //这个双端队列的长度
d.empty(); //返回这个双端队列是否为空
d.clear(); //清空这个双端队列
d.front(); //返回第一个元素
d.back(); //返回最后一个元素
d.push_back(); //向最后插入一个元素
d.pop_back(); //弹出最后一个元素
d.push_front(); //向队首插入一个元素
d.pop_front(); //弹出第一个元素
d.begin(); //双端队列迭代器首位
d.end(); //双端队列迭代器末位的下一位