算法题常用stl容器用法总结

目录

vector

stack

map

set

queue

priority_queue

deque


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();  //返回第一个元素

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值