12 | 三分天下的容器:恰当选择,事半功倍
该思维导图由 AI 生成,仅供参考
认识容器
- 深入了解
- 翻译
- 解释
- 总结
C++标准库中的容器包括顺序容器、有序容器和无序容器。顺序容器包括数组、向量、双端队列和链表,适用于不同的场景。有序容器使用红黑树进行自动排序,而无序容器则采用散列表存储数据,速度更快。在选择容器时,需根据需求避免多余操作,如只需末尾添加元素应选用deque或list,而只需快速查找元素且无需排序时应选用unordered_set。总的来说,了解容器的基本特性和内部结构的优缺点,有助于在写程序时做出明智选择。文章还提到了一些小技巧,如多利用类型别名,以便随意改换不同的容器,对开发和测试都非常方便。整体而言,本文全面介绍了C++标准库中各种容器的特性,帮助读者快速了解并选择合适的容器。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(38)
- 最新
- 精选
- EncodedStar这节课把容器简直讲活了,最后的小技巧很实用,nice
作者回复: thanks。
2020-06-0224 - 泰伦卢关于vector扩容机制,建议加个平台前置条件,windows和linux系统的stl vector平台的扩容倍数是不一样的,而且移动端平台也有好多种stl,有gnustl和c++sharedstl等,不清楚具体实现,可能也会有所区别!
作者回复: 感谢补充,在Linux下习惯了,不太关注其他平台。
2020-06-0212 - Eason Tai有一说一,配合c++ prime和自己手敲来看专栏,互相验证,真的挺舒服的。
作者回复: 很好的学习方法,nice。
2020-06-0211 - 群文中说key必须具备两个条件,其中第二个条件, "第二个则是因为 hash 值可能会冲突,所以当 hash 值相同时,就要比较真正的 key 值", 当hash值一样时,直接把新添加的元素添加到hash值相等的队列后边不就行了吗?为什么再比较key值呢? 这里,比较key值有什么用处吗?比较了之后可以用来做什么呢?没明白这里的意思,老师可以稍微解释一下吗?
作者回复: 举个例子吧,比如说用string作为key,abc和cba,两者的hash值是相同的,都放进了一个开链表里,但这两个元素显然是不同的,真正要找cba就必须在这个链表里取比较查找。 关键在于hash值相等不代表key就一定相等,因为hash值只是一个映射,还必须去比较真正的实体。
2020-06-0526 - Wei Zhoureturn std::hash()(p.x) 第一个括号是什么意思 ?
作者回复: std::hash是一个类,所以std::hash()就是构造函数,创建了一个临时对象,而std::hash又重载了operator(),所以这个临时对象可以像函数一样调用。 这是c++里函数对象的常见用法,第一次见可能会有点理解困难。
2021-10-215 - 逆风翻盘我可以多利用类型别名,而不要“写死”容器定义。老师,这句话能给个例子嘛?
作者回复: 比如: using data_type = map<int,string>; 这样,在代码里用data_type,而不是直接的map类型,以后可以随时改变data_type的定义,比如换成: using data_type = unordered_map<int,string>;
2021-06-265 - java2c++问题1:所有的容器都是为了用来存放元素,理论上直接用数组就可以了,但是增删改查的效率未必如你所愿了。所以标准库又搞了那么多容器是为了满足各个不同的使用场景。 增删改查效率最高的underd_set,时间复杂度是O(1) ,不过它是无序的,另外不能按下标查询。 其次是红黑树,跳表,时间复杂度是O(logN)。 相对于array它们共同的优点是不需要显性扩容,底层都处理好了
作者回复: 说的很好。 注重查询效率通常就会选择无序容器,但还有其他很多时候容器注重的是存储,所以就可以选择array、vector,等全存完了之后再排序查找。
2020-06-085 - 无为而立顺便复习了下,deltype哈哈,感觉把它当成函数更好理解
作者回复: 说得对,也可以把它理解成是编译阶段的函数,计算表达式的类型。
2020-06-025 - 木瓜777如果使用unorder_map,对自定义的结构,例如 struct Point {float x;float y},该如何实现hash?对多个float 有没有好的hash方法?
作者回复: 可以使用标准库里的std::hash函数对类成员逐个hash。 但浮点数不建议用hash,它不精确。
2020-06-033 - l c老师您好, 对于这里 auto comp = [](auto a, auto b) // 定义一个lambda,用来比较大小 { return a > b; // 定义大于关系 }; 之前一般我都是直接用一般函数写的,请问使用lambda的优势在哪里呢?
作者回复: 简单方便,就地定义,不像普通函数,需要跑到源码文件前面去写,局部化更好理解和维护。
2020-08-102