1. vector 变长数组,倍增思想.
size() 返回元素个数
empty() 返回是否为空
clear() 清空
front()/back() 返回第一个数/返回最后一个数
push_back()/pop_back() 在最后插入一个数/把最后一个数删掉
begin()/end() 第0个数/最后一个数的后面那个数
支持比较运算,按字典序
基本思想:
系统为某一程序分配空间的时候,所需的时间基本与空间大小无关,与申请次数有关。
先申请一段长的空间存入元素,当不够存时则创建一个大小为原来两倍的空间,并把元素复制进去。
2. pair<int, int> 可以存储一个二元组
first 第一个元素
second 第二个元素
支持比较运算,按字典序(以first为第一关键字,second为第二关键字)
3. string 字符串,重要的函数:substr(), c_str().
size()
empty()
clear()
4. queue 队列
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素.
priority_queue 优先队列(默认是大根堆)
push() 往堆中插入元素
top() 返回堆顶
pop() 弹出堆顶
5. stack 栈
size()
empty()
push() 往栈顶添加元素
top() 返回栈顶元素
pop() 弹出栈顶元素
6. deque 双端队列
size()
empty()
clear()
front()
back()
push_back()/pop_back()
push_front()/pop_front()
begin()/end()
快速寻址[ ]
7. set, map, multiset, multimap 基于平衡二叉树(红黑树),动态维护有序序列。
size()
empty()
clear()
begin()/end() ++, -- 返回前驱和后继
set & multiset:set里面不可以有重复元素,multiset里面可以有重复元素。
(1) set/multiset
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
erase() 如果输入是一个数,删除所有等于这个数的节点O(k + logn);如果输入是一个迭代器,那么删除这个迭代器;
lower_bound(x)/upper_bound(x) 返回大于等于x的迭代器/返回大于x的迭代器。
(2) map/multimap
insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 可以像用数组一样使用它 O(logn).
8. unordered_set, unodered_map, unordered_multiset, unordered_multimap 基于哈希表
和上面类似,增删查改的时间复杂度为O(1)
不支持lower_bound/upper_bound() 迭代器++--(跟排序有关的所有操作都不支持)
9. bitset 压位
要存1024个bool元素,C++里面bool类型是一个字节,所以需要1024个字节,但如果压到一个字节存8位,则只需要128字节就存完了
bitset<10000> S;
~, &, |, ^, >>, <<, ==, !=, [],
count() 返回1的个数
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置变为1
set(k, v) 将第k位变成1
reset() 把所有位变为0
flip() 等价于所有位取反
flip(k) 把第k位取反
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<set>
#include<map>
using namespace std;
int main()
{
vector<int> a;
//vector<int> a(10);
//vector<int> a(10, 3);
//vector<int> a[10];//定义了十个vector
//for(auto x : a) cout << x << endl;
for(int i = 0; i < 10; i ++) a.push_back(i);
for(int i = 0; i < a.size(); i ++) cout << a[i] << ' ';
cout << endl;
//vector<int>::iterator 可以直接写成auto
for(vector<int>::iterator i = a.begin(); i != a.end(); i ++) cout << *i << ' ';
cout << endl;
for(auto x: a) cout << x << ' ';
cout << endl;
//支持比较运算
vector<int>b1(3, 4), b2(4, 3);
if(b1 > b2) puts("b1 > b2");
/**********************************************/
pair<int, string> p;
p = make_pair(10, "abc");
p = {20, "abc"};
pair<int, pair<int, int>> p1;
/*********************************************/
string s = "abc";
s += "def";
s += 'c';
cout << s << endl;
cout << s.substr(1, 2) << endl;//从s[1]开始,子串长度为2
s.substr(1, 10);//从1开始整个
s.substr(1); //从1开始整个
printf("%s\n", a.c_str());//返回存储字符串的起始地址
/********************************************/
queque<int> q;
q = queue<int>();
/*********************************************/
priority_queue<int> heap;
//如果要定义小根堆
//heap.push(-x)//方法一:插入负数
priority_queue<int, vector<int>, greater<int>> small_heap;
//方法二:直接定义小根堆
/*********************************************/
map<string, int> m;
m["abc"] = 1;
cout << m["abc"] << endl;
return 0;
}