目录
vector
- 添加元素
vector<int> vec;
vec.push_back(i);
- 获取大小与判断非空
(所有stl都相同)
- 初始化
vector<int> vec;
- 删除
删除全部元素
vec.clear();
删除第i号元素,从0开始计算,如i=3则把元素“4”删除。
vector<int> vec = { 1,2,3,4,5 };
vec.erase(vec.begin()+i);
删除末尾元素
vector<int> vec = { 1,2,3,4,5 };
vec.pop_back();
//输出结果为1234
- 排序
bool cmp(int a, int b) {
return a < b;//升序
}
int main() {
vector<int> vec = { 1,-2,0,-4,5 };
sort(vec.begin(), vec.end(),cmp);
}
- 查询
查询的方法返回的是一个迭代器
vector<int> vec{ 1,2 };
vector <int> ::iterator i;//迭代器
i = find(vec.begin(), vec.end(), 1);
if (i == vec.end()) cout << "没找到" << endl;
else cout << *i;
- 插入
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> demo{ 1,2 };
在第i个位置插入元素,即占掉第i个元素的位置
demo.insert(demo.begin() + 1, 3);//{1,3,2}
在迭代器的位置后面添加n个对应元素
demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}
合并数组的方法
vector<int> test{ 7,8,9 };
demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
stack
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
stack不能使用for(auto val:stack)的方式进行遍历,只能获取头部元素,然后再一个一个退出。
map
map会根据键的大小自动做排序,如果不需要排序增加效率则使用unordered_map
- 初始化与赋值、遍历
#include <iostream>
#include <map>
#include<string>
using namespace std;
int main()
{
map<string, int> strMap;
strMap["123"] = 1;
strMap["234"] = 2;
for (auto val : strMap) {
cout << val.first << " " << val.second<<endl;
}
for (auto i = strMap.begin(); i != strMap.end(); ++i) {
cout << i->first << " "<< i->second << endl;
}
}
- 插入
除了使用[]符去直接赋值外,还可以这样:
由于map里的元素原本就是pair型的,因此可以
strMap.insert(pair<string, int>("345", 3));
反过来同理,可以往元素是pair元素的容器直接插入map里的元素。
#include<queue>
using namespace std;
int main()
{
vector<pair<string, int>> vec;
priority_queue< pair<string, int>> pq;
map<string, int> strMap;
strMap["123"] = 1;
strMap["234"] = 2;
for (auto val : strMap) {
vec.push_back(val);
pq.push(val);
}
}
迭代器同理:
- 查找
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,
(map使用find函数,是查找是否存在该key值而非value)
- 根据键删除
下面两种方式等价
map<string,int> mp;
mp["abe"] = 2;
mp["abd"] = 3;
mp["abf"] = 3;
map<string, int>::iterator iter = mp.find("abd");
mp.erase(iter);
mp.erase("abd");
- 根据值删除
对于map,如果需要根据某些条件删除,此时不能直接删除,例如:
(下面写错了一个地方,应该是i.second,(second才代表值)
- map使用需要注意的点!
1、在map中,由key查找value时,首先要判断map中是否包含key。
2、如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null。
可以观察到,此时自动创建了这个元素:
set
set容器具有两个特点,会自动排序,并且去重
unordered_set具有set所有特点除了自动排序
- 初始化
set<int> q; //以int型为例 默认按键值升序
set<int,greater<int>> p; //降序排列
- 插入和删除
int x;
q.insert(x); //将x插入q中
q.erase(x); //删除q中的x元素,返回0或1,0表示set中不存在x
queue
- front():返回 queue 中第一个元素的引用。
- back():返回 queue 中最后一个元素的引用。
- push(const T& obj):在 queue 的尾部添加一个元素的副本。
- pop():删除 queue 中的第一个元素。
- emplace():在 queue 的尾部生成对象。
priority_queue
优先级队列,底层是堆:
//小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//大顶堆
priority_queue <int,vector<int>,less<int> >q;
//默认大顶堆
priority_queue<int> a;
大顶堆即根元素最大
默认方法和queue一样,不过自带排序,补充一下priority_queue的排序方法
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <string>
using namespace std;
class cmp{
/*在左边(也就是队尾),优先级越低
* 默认使用less,小数在左边优先级越低
* 可选greater,大数在左边优先级越低
*
* */
bool operator ()(int a,int b){
return a<b;//小的放左边,即less
}
};
class cmp2{
bool operator ()(int a,int b){
return a>b;//大的放左边,即greater
}
};
int main(){
priority_queue<int,vector<int>,cmp> pq;
pq.push(4);
pq.push(8);
pq.push(1);
pq.push(5);
while(!pq.empty()){
cout<<pq.top()<<" ";
pq.pop();
}
}
deque
双端队列
- 插入
- 删除
dec.pop_back(); //尾部删除
dec.pop_front(); //头部删除
//erase操作
//iterator erase (iterator position);
dec.erase(dec.begin());
//iterator erase (iterator first, iterator last);
dec.erase(dec.end()-3, dec.end());
- 获取元素
dec.back(); //返回最后一个元素
dec.front(); //返回第一个元素