[转载] C++常见容器及其操作

        本文主要记录一下STL中一些常见的容器(包括vector、deque、queue、list、stack、set、map),及其对应的常见的操作,不涉及更深层次原理性的知识。方便以后使用、查阅。

1、vector

vector 容器结构示意图

                                  

 vector:顺序存储容器,和数组非常相似,也被称为单端数组,只能从尾部增加删除元素。

vector的动态扩容:

        1.申请更大的空间

        2.赋值原数据到新空间

        3.释放原空间

vector 常见操作:

2、deque

deque 容器结构示意图:

deque:

        顺序存储容器,两端都可插入与删除,也被称为双端数组。虽然都是顺序存储容器,但是vector访问元素的速度要比deque快

与vector的区别:

        ① vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。可以在头尾两端做元素的插入和删除操作,虽然vector也可以,但是在其头部操作效率奇差,无法接受,而deque则可以使用常数项时间对头端进行插入和删除操作。

        ② deque没有容量的概念,因为他是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样“旧空间不足而重新配置一块更大空间,然后复制元素。在释放旧空间”这样的事在deque身上是不会发生的。

deque内部工作原理:

                                            

 deque常见操作:(与vector基本类似)

        ① 没有capacity() 和reserve()操作

        ② 增加头端插入和删除操作:

                              q.push_front() 和q.pop_back() 、q.emplace_front()操作

3、queue

queue 容器结构示意图:

                                         

queue:

        先进先出(First In First Out, FIFO)的存储容器(两端),只能从尾部插入、头部删除。注意queue的front()在右边。vector和deque都在左边

queue常见操作:

        注意queue没有迭代器,是因为迭代器用于对数据结构中的元素进行顺序访问或者随机访问。而queue的定义不允许顺序或随机访问,所以迭代器对于queue来说没有意义(只能从尾部插入,永远只能访问front())

4、list

list 容器结构示意图:

                                    

 list: 非连续的存储空间,是一个双向循环链表,动态存储分配。由于链表的特性,使list可以在常数范围内在任意位置进行插入和删除,但是不支持[] 和随机访问。

list 常见操作:

5、stack

stack 容器结构示意图:

                                              

stack: 一种先进后出(First In Last Out, FILO)的数据结构,只有一个出口,只能在栈顶插入与删除。

stack 常见操作:

6、set/multiset

set: 集合,一种关联性容器。底层是红黑树实现的。

特点:

1)、所有元素在插入时自动被排序;

2)、set不允许容器中有重复的值,multiset允许容器中有重复的元素;

set常见操作:

7、map/multimap
map: 一种关联性容器。底层是红黑树实现的。

特点:

1)、map中所有的元素都是pair,其中pair第一个元素为key(键值),第二个元素为value(实值);

2)、所有元素都会根据元素的key(键值)自动排序;

3)、map中不允许有重复的key值元素,multimap中允许有重复的key值元素;

map 常见操作:


8、几种容器的对比

名称类型存储结构支持迭代器增加元素删除元素支持find随机访问
vector顺序容器连续存储空间
(数组)
支持尾部增加
(push_back)
尾部删除
(pop_back)
自己不支持find支持快速随机访问
deque顺序容器连续存储空间
(双端数组)
支持尾部增加
(push_back)
头部增加
(push_front)
尾部删除
(pop_back)
头部删除
(pop_front)
自己不支持find支持快速随机访问
queue顺序容器连续存储空间
(FIFO)
不支持队尾增加
(push)
队头删除
(pop)
不支持不支持
list顺序容器非连续存储空间
(双向循环链表)
支持尾部增加
(push_back)
头部增加
(push_front)
尾部删除
(pop_back)
头部删除
(pop_front)
自己不支持find不支持
stack顺序容器连续存储空间
(FILO)
不支持栈顶增加
(push)
栈顶删除
(pop)
不支持不支持
set关联容器红黑树支持inserterase支持/
map关联容器红黑树支持insert
[]赋值
erase支持/

PS:

对于自己不支持find(即,成员函数没有find)的,可以使用泛型算法进行find;
只有list自己含有sort成员函数,其它能排序(vector、deque)的容器只能调用泛型算法;
对于  erase 操作,对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器;     对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。     对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator。


原文链接:https://blog.csdn.net/bailang_zhizun/article/details/118938955

如有侵权请及时联系我删除:qq:1694088471

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++ STL库中的set容器是一个用于存储元素的关联容器,它的元素默认按照升序排列,并且保证元素的唯一性。set容器的基本操作包括: 1. 插入元素:使用insert()函数向set容器中插入元素。插入元素的时间复杂度为O(log n)。 ```c++ #include <iostream> #include <set> int main() { std::set<int> s; s.insert(3); s.insert(1); s.insert(4); s.insert(1); // 重复元素不会被插入 s.insert(5); for (auto x : s) { std::cout << x << " "; } std::cout << std::endl; return 0; } ``` 上述代码输出:1 3 4 5 2. 删除元素:使用erase()函数删除set容器中的元素,可以指定要删除的元素值,也可以指定一个迭代器范围。删除元素的时间复杂度为O(log n)。 ```c++ #include <iostream> #include <set> int main() { std::set<int> s{3, 1, 4, 1, 5}; s.erase(1); // 删除元素值为1的元素 for (auto x : s) { std::cout << x << " "; } std::cout << std::endl; return 0; } ``` 上述代码输出:3 4 5 3. 查找元素:使用find()函数和count()函数查找set容器中的元素,find()函数返回一个指向要查找的元素的迭代器,如果元素不存在,则返回end()迭代器。count()函数返回要查找的元素在set容器中出现的次数,因为set容器中的元素保证唯一性,所以count()函数的返回值只能是0或1。查找元素的时间复杂度为O(log n)。 ```c++ #include <iostream> #include <set> int main() { std::set<int> s{3, 1, 4, 1, 5}; auto it = s.find(4); if (it != s.end()) { std::cout << "4 is found" << std::endl; } else { std::cout << "4 is not found" << std::endl; } std::cout << "1 appears " << s.count(1) << " times" << std::endl; std::cout << "2 appears " << s.count(2) << " times" << std::endl; return 0; } ``` 上述代码输出:4 is found,1 appears 1 times,2 appears 0 times。 除了上述基本操作外,set容器还支持迭代器操作和比较操作。更详细的使用方法可以参考C++ STL库的set容器文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值