本质上是一个动态数组,运用了一个倍增的思想
empty( ) 和 size( ) 是所有容器都有的操作
#includeint main() { vector a; //定义一个a数组 //vector a(n) 定义一个长度为n的a数组 //vector a(10, 3) 定义一个长度为10,元素都是3的a数组 //判断是否为空,空返回true,非空返回false a.empty(); //返回容器长度,时间复杂度为O(1) a.size(); //清空 a.clear(); //返回第一个元素,返回最后一个元素 front(); / back(); //在最后面加入一个元素,将最后一个元素弹出 push_back(); / pop_back(); //迭代器,第0个元素,最后一个元素后面一个数 begin(); / end(); //vector支持随机寻址,跟数组一样 //有三种遍历方式 for (int i = 0; i < a.size(); i++) cout << a[i] << ' '; for (vector ::iterator i = a.begin(); i != a.end(); i++) cout << *i << ' '; for (auto x : a) //auto可以自动推断变量的类型 cout << x << ' '; //vector支持比较运算,按字典序进行排序 vector a(4, 3), b(3, 4); if (a < b) puts("a < b"); return 0; }
系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关。
二、pair
可以存储一个二元组,first 第一个元素,second 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(类似于字典序),常用于排序
int main()
{
pair p;
//访问第一个元素,访问第二个元素
p.first(); p.second();
//构造一个pair
p = make_pair(10, "psy");
//初始化
p = (10, "abc");
//三重
pair> p;
return 0;
}
三、string
处理字符串
substr() 返回某一个字串
c_str() 返回string字符数组对应的头指针
#includeint main() { string op; //长度,判空,清空 op.size()/op.length();op.empty();op.clear(); //添加 op += "abc"; //返回某个子串 //两个参数,分别代表头和子串的长度,如果尾超过长度,则返回全部,或者只写一个参数,返回从这个参数往后所有元素 a.substr(2, 10); a.substr(2); //用printf返回整个字符数组,用c_str() printf("%sn", a.c_str()); return 0; }
四、queue、priority_queue
queue:push() 往队尾插入元素;front() 返回队头元素;pop() 弹出队头元素
#includeint main() { queue q; //长度;判空 q.size(); q.empty(); //队尾插入;返回队头;返回队尾;弹出队头 q.push(); q.front(); q.back(); q.pop(); //清空 q = queue (); return 0; }
priority_queue:优先队列,其实是一个堆,push() 往堆里插入一个元素;top() 返回堆顶元素;pop() 弹出堆顶元素
#include#include int main() { priority_queue heap; //默认大根堆 //定义小根堆 priority_queue , greater > heap; //插入一个元素、返回堆顶元素、弹出堆顶元素 heap.push(); heap.top(); heap.pop(); return 0; }
五、stack
栈:先进后出,后进先出
#includeint main() { stack s; //长度、判空 s.size(); s.empty(); s.push(); //往栈顶加入一个元素 s.top(); //返回栈顶元素 s.pop(); //弹出栈顶元素 return 0; }
六、deque
双端队列,队头队尾都可以插入弹出,可看作是一个加强版的vector
#includeint main() { //长度、判空、清空 size(); empty(); clear(); //返回头和尾 front(); back(); //插入和删除尾元素 push_back(); pop_back(); //插入和删除头元素 push_front(); pop_front(); //使用迭代器返回头和尾 begin(); end(); //支持随机寻址 []; return 0; }
七、set、map、multiset、multimap
基于平衡二叉树(红黑树)来实现,动态地维护有序序列
set
#includeint main() { set s; //会自动删掉重复元素 multiset ms; //允许重复元素存在 //长度、判空、清空 s.size(); s.empty(); s.clear(); //迭代器,返回某个数的前驱和后继 O(logn) begin(); end(); //插入一个元素 s.insert(); //查找一个数,没有则返回end s.find(); //返回一个数的个数 s.count(); //删除有两种操作 // (1)输入是一个数x,删除所有x // 时间复杂度为 O(k + logn) k为x的个数 // (2)输入是一个迭代器,删除则个迭代器 s.erase(); //返回大于等于x的最小的数 lower_bound(); //返回大于x的最小的数 upper_bound(); return 0; }
map
#include
八、unordered_set、unordered_map、unordered_multiset、unordered_multimap
基于哈希表来实现
同上面类似,增删查改的时间复杂度大多是 O(1).
不支持 lower_bound() / upper_bound() ,迭代器的加加减减,所有与排序有关的都不支持
九、bitset
压位
#includeint main() { bitset<10000> s; //支持以下操作 ~, &, |, ^ >>, << ==, != [] count(); //返回有多少个1 any(); //判断是否至少有一个1 none(); //判断是否全为0 set(); //把所有位置变成1 set(k, v); //将第k位变成v reset(); //把所有位置变成0 flip(); //等价于取反~ flip(k); //把第k位取反 return 0; }



