(温馨提示:本文章适合有一定基础的同学考前熟悉)
包含:vector,stack,queue,map,set,pair,string等常见容器的定义、常用函数及注意事项。
超级详细,超级全面,考个350绝对够用了!(大佬也不会来看我这个的)
第一次正式写东西,好多东西用不熟练,之后会慢慢改进的,大家请多指教!
Vector
指定长度和初始值的初始化:
vector<int> v(n); // 定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]
vector<int> v(n, 1); // v[0] 到 v[n - 1]所有的元素初始值均为1
//注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)
初始化中有多个元素:
vector<int> a{1, 2, 3, 4, 5};//数组a中有五个元素,数组长度就为5
常用函数:
c.front() //返回第一个数据O ( 1 ) O(1)O(1)
c.back() //返回数组中的最后一个数据 O ( 1 ) O(1)O(1)
c.pop_back() //删除最后一个数据O ( 1 ) O(1)O(1)
c.push_back(element) //在尾部加一个数据O ( 1 ) O(1)O(1)
c.size() //返回实际数据个数(unsigned类型)O ( 1 ) O(1)O(1)
c.clear() //清除元素个数O ( N ) O(N)O(N),N为元素个数
c.resize(n, v) //改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0
c.insert(it, x) //向任意迭代器it插入一个元素x ,O ( N ) O(N)O(N)
//例:c.insert(c.begin() + 2,-1) //将-1插入c[2]的位置
c.erase(first,last) //删除[first,last)的所有元素,O ( N ) O(N)O(N)
c.begin() //返回首元素的迭代器(通俗来说就是地址)O ( 1 ) O(1)O(1)
c.end() //返回最后一个元素后一个位置的迭代器(地址)O ( 1 ) O(1)O(1)
c.empty() //判断是否为空,为空返回真,反之返回假 O ( 1 ) O(1)O(1)
sort(c.begin(), c.end());
vector<int> a(n + 1);
sort(a.begin() + 1, a.end()); // 对[1, n]区间进行从小到大排序
访问:
vector<int> vi; //定义一个vi数组
vector<int>::iterator it = vi.begin(); //声明一个迭代器指向vi的初始位置
stack
常用函数:
s.push(ele) 元素ele入栈,增加元素 O ( 1 ) O(1)O(1)
s.pop() 移除栈顶元素 O ( 1 ) O(1)O(1)
s.top() 取得栈顶元素(但不删除)O ( 1 ) O(1)O(1)
s.empty() 检测栈内是否为空,空为真 O ( 1 ) O(1)O(1)
s.size() 返回栈内元素的个数 O ( 1 ) O(1)O(1)
栈遍历:
stack<int> st;
for (int i = 0; i < 10; ++i) st.push(i);
while (!st.empty()) {
int tp = st.top(); // 栈顶元素
st.pop();
}
Queue
常用函数:
q.front() 返回队首元素 O ( 1 ) O(1)O(1)
q.back() 返回队尾元素 O ( 1 ) O(1)O(1)
q.push(element) 尾部添加一个元素element 进队O ( 1 ) O(1)O(1)
q.pop() 删除第一个元素 出队 O ( 1 ) O(1)O(1)
q.size() 返回队列中元素个数,返回值类型unsigned int O ( 1 ) O(1)O(1)
q.empty() 判断是否为空,队列为空,返回true O ( 1 ) O(1)O(1)
priority_queue优先队列:
在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。底层是通过堆来实现的。
q.top() 访问队首元素 O ( 1 ) O(1)O(1)
q.push() 入队 O ( l o g N ) O(logN)O(logN)
q.pop() 堆顶(队首)元素出队 O ( l o g N ) O(logN)O(logN)
q.size() 队列元素个数 O ( 1 ) O(1)O(1)
q.empty() 是否为空 O ( 1 ) O(1)O(1)
注意没有clear()! 不提供该方法
优先队列只能通过top()访问队首元素(优先级最高的元素)
priority_queue<int> pq; // 默认大根堆, 即每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, greater<int>> q; // 小根堆, 每次取出的元素是队列中的最小值
map
常用函数:
mp.find(key) 返回键为key的映射的迭代器 $O(logN) $ 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回m p . e n d ( ) mp.end()mp.end()
mp.erase(it) 删除迭代器对应的键和值O ( 1 ) O(1)O(1)
mp.erase(key) 根据映射的键删除键和值 O ( l o g N ) O(logN)O(logN)
mp.erase(first,last) 删除左闭右开区间迭代器对应的键和值 O ( l a s t − f i r s t ) O(last-first)O(last−first)
mp.size() 返回映射的对数$ O(1)$
mp.clear() 清空map中的所有元素O ( N ) O(N)O(N)
mp.insert() 插入元素,插入时要构造键值对
mp.empty() 如果map为空,返回true,否则返回false
mp.begin() 返回指向map第一个元素的迭代器(地址)
mp.end() 返回指向map尾部的迭代器(最后一个元素的下一个地址)
mp.rbegin() 返回指向map最后一个元素的迭代器(地址)
mp.rend() 返回指向map第一个元素前面(上一个)的逆向迭代器(地址)
mp.count(key) 查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0
mp.lower_bound() 返回一个迭代器,指向键值>= key的第一个元素
mp.upper_bound() 返回一个迭代器,指向键值> key的第一个元素
用于正向遍历map :
map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.begin();
while(it != mp.end()) {
cout << it->first << " " << it->second << "\n";
it ++;
}
用于逆向遍历map:
map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.rbegin();
while(it != mp.rend()) {
cout << it->first << " " << it->second << "\n";
it ++;
}
其他:
map:内部用红黑树实现,具有自动排序(按键从小到大)功能。空间占用较大。
unordered_map:内部用哈希表实现,内部元素无序杂乱。查找速度非常快。
查询容器内部元素的最优方法是:先判断存在与否,再索引对应值(适用于这两种容器)
set
常用函数:
元素不会重复,元素自动从小到大排序。
s.begin() 返回set容器的第一个元素的地址(迭代器)O ( 1 ) O(1)O(1)
s.end() 返回set容器的最后一个元素的下一个地址(迭代器)O ( 1 ) O(1)O(1)
s.rbegin() 返回逆序迭代器,指向容器元素最后一个位置O ( 1 ) O(1)O(1)
s.rend() 返回逆序迭代器,指向容器第一个元素前面的位置O ( 1 ) O(1)O(1)
s.clear() 删除set容器中的所有的元素,返回unsigned int类型O ( N ) O(N)O(N)
s.empty() 判断set容器是否为空O ( 1 ) O(1)O(1)
s.insert() 插入一个元素
s.size() 返回当前set容器中的元素个数O ( 1 ) O(1)O(1)
erase(iterator) 删除定位器iterator指向的值
erase(first,second) 删除定位器first和second之间的值
erase(key_value) 删除键值key_value的值
s.find(element) 查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束
s.count(element) 查找set中的元素出现的个数,由于set中元素唯一,此函数相当于查询element是否出现
s.lower_bound(k) 返回大于等于k的第一个元素的迭代器O ( l o g N ) O(logN)O(logN)
s.upper_bound(k) 返回大于k的第一个元素的迭代器O ( l o g N ) O(logN)O(logN)
其他:
重载<运算符 改变set排序规则,set中默认使用less比较器,即从小到大排序。
set<int> s1; // 默认从小到大排序
set<int, greater<int> > s2; // 从大到小排序
multiset:元素可以重复,且元素有序
unordered_set :元素无序且只能出现一次
unordered_multiset : 元素无序可以出现多次
pair
p[i].first p [i].second; emmm.......pari 好少,好可怜😂
string
介绍一下:
支持比较运算符
string字符串支持常见的比较操作符(>,>=,<,<=,==,!=),支持string与C-string的比较(如 str < "hello")。支持+运算符,代表拼接字符串
string字符串可以拼接,通过"+"运算符进行拼接。
输入输出讲究:
读入字符串,遇空格,回车结束
string s;
cin >> s;
读入一行字符串(包括空格),遇回车结束
string s;
getline(cin, s);
cin cout解锁使用时,不能与 scanf,getchar, printf,cin.getline()混用,一定要注意,会出错。
常用函数:
获取字符串长度
s.size()和s.length() 返回string对象的字符个数,他们执行效果相同。
s.max_size() 返回string对象最多包含的字符数,超出会抛出length_error异常
s.capacity() 重新分配内存之前,string对象能包含的最大字符数
插入
s.push_back() 在末尾插入
例:s.push_back('a') 末尾插入一个字符a
s.insert(pos,element) 在pos位置插入element
例:s.insert(s.begin(),'1')在第一个位置插入1字符
s.append(str) 在s字符串结尾添加str字符串
例:s.append("abc") 在s字符串末尾添加字符串“abc”
删除
erase(iterator p) 删除字符串中p所指的字符
erase(iterator first, iterator last) 删除字符串中迭代器区间[first,last)上所有字符
erase(pos, len) 删除字符串中从索引位置pos开始的len个字符
clear() 删除字符串中所有字符
字符替换
s.replace(pos,n,str) 把当前字符串从索引pos开始的n个字符替换为str
s.replace(pos,n,n1,c) 把当前字符串从索引pos开始的n个字符替换为n1个字符c
s.replace(it1,it2,str) 把当前字符串[it1,it2)区间替换为str it1 ,it2为迭代器哦
大小写转换
法一:
tolower(s[i]) 转换为小写
toupper(s[i]) 转换为大写
法二:
string s;
transform(s.begin(),s.end(),s.begin(),::tolower);//转换小写
transform(s.begin(),s.end(),s.begin(),::toupper);//转换大写
分割
s.substr(pos,n) 截取从pos索引开始的n个字符
查找
s.find (str, pos) 在当前字符串的pos索引位置(默认为0)开始,查找子串str,返回找到的位置索引,-1表示查找不到子串
s.find (c, pos) 在当前字符串的pos索引位置(默认为0)开始,查找字符c,返回找到的位置索引,-1表示查找不到字符
s.rfind (str, pos) 在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串
s.rfind (c,pos) 在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符
s.find_first_of (str, pos) 在当前字符串的pos索引位置(默认为0)开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符
s.find_first_not_of (str,pos) 在当前字符串的pos索引位置(默认为0)开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符
s.find_last_of(str, pos) 在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符
s.find_last_not_of ( str, pos) 在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串
排序 sort(s.begin(),s.end()); //按ASCII码排序
我就想问一下,谁能比我细!