【DS总结】C++容器使用对比和选择【未完待续】

本文探讨了C++中map和priority_queue<pair<> >在常用操作和特性上的比较,提供了容器选择的心得,帮助开发者理解何时选用哪种容器更合适。

常用操作一览表

 

容器创建遍历特殊特性参考链接
list       
vector

1. vector<int> vec;

 

2. vector<int> vec(10, 0);  // 长度10,初始值0

 

3. 匿名变量:vectot<int>(10, 0);

 

4. 多维:

vector<vector<bool>> vec(10, vector<bool>(10, false));

1. vec.push_back(1);

 

2. vec.insert(vec.begin(), 1);

 

3. vec.insert(vec.begin(), vec2.begin(),vec2.end());

1. vec.pop_back();

 

2. vec.clear();

 

3. vec.erase(vec.begin());

 

4. vec.erase(vec.begin(), vec.begin()+5);

//删除[begin, begin+5)的元素

1. vec.size();

 

2. vec.empty();

 

3. vec[0];

 

4. vec.at(0);

 

5. vec.front();

 

6. vec.back();

 

7. find(vec.begin(), vec.end(), 1);

1. for(int i=0; i<vec.size(); ++i)

 

2. for( auto i: vec)

 

3. for( auto iter=vec.begin(); iter!=vec.end(); ++iter)

1. 可以用[ ]下标访问1. cppreference
unordered_set

1. 自定义存储类型和hash函数

auto hash_function = [](const pair<int,int>& o) {return hash<int>()(o.first) ^ hash<int>()(o.second);}; 

unordered_set<pair<int,int>, decltype(hash_function)> dp(0, hash_function);

   

1. for( aotu iter=us.begin(); iter!=us.end(); ++iter)

 

2. for( auto item: us)

 1. 自定义hash函数
set1. set<int> s;  

1. s.lower_bound(3); //找<=3的最大元素,没有则返回s.end()

2. s.upper_bound(3); //找>3的最小元素

3. *(set.begin());

   

multiset 

//允许有重复元素的set,其他用法同set

       
unordered_map       
map

1. map<char, int> m;

 

2. map<char, int, cmp> m;

// 自定义比较函数cmp,默认操作符< key升序排序

1. m['a']=1; //未创建的key在访问时自动创建,初始为0

 

2. m.insert('a'); m['a']=1;

1. m.clear();

 

2. m.erase('a');

 

3. m.erase(m.begin());

 

4. m.erase(m.begin(), m.begin()+5);

1. m.size();

 

2. m.empty();

 

3. m['a'];

 

4. m.find('a');

1. for(auto iter=m.begin(); iter!=m.end(); ++iter)

1.key值唯一

2.[key]访问直接新建

3.自动按key递增排序

1.map用法

2.cppreference

stack

1. stack<int> s;

 

2.stack<pair<int, int>> sp;

1. s.insert(1);

 

2.sp.emplace(1,1);  //在顶部构造新元素

     
queue1. queue<int> q;1. q.push(1);1. q.pop();

1. q.front();

 

2. q.back();

   
priority_queue

1. priority_queue<int> qp;

 

2. priority_queue< pair<char, int>, vector<pair<char,int>>, cmp> qp2;

// 自定义比较函数cmp,默认操作符< 降序排序

1. qp.push(1);

1. pq.pop();

// 没有erase和clear

1. qp.size();

 

2. qp.empty();

 

3. pq.top(); //这个和stack同

1. while(!qp.empty()){

    pq.top();

    pq.pop();

}

1.值可重复

2.自动递减排序

3.只能头出尾入

1.cppreference

2.pq自定义比较

dequeue1. deque<int> dq;

1. dp.push_back(1);

 

2. dq.push_front(2);

1. dp.pop_back();

 

2. dq.pop_front();

1. dp.size();

 

2. dq.empty();

 

3. dq.front();

 

4. dq.back();

1. while(!dq.empty()){

    dq.front();

    dq.pop_front();

}

1. 头尾都可出入1.cppreference

 

特性比较

1.map vs priority_queue<pair<>>

 map< >priority_queue< pair< >>
排序

默认递增排序

默认使用less,定义<

默认递减排序

默认使用less,定义>

元素值

key不可重复

插入重复的key会忽略后者,想要替换需要先erase原本的

元素可重复

 

容器选择心得

 

 

 

 

 

 

参考:https://www.cnblogs.com/engineerLF/p/5393006.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值