C++核心准则​​SL.con.2:除非有理由使用其他容器,默认使用STL vector

面向对象思考

共 3314字,需浏览 7分钟

 ·

2020-10-18 18:34

SL.con.2: Prefer using STL vector by default unless you have a reason to use a different container

SL.con.2:除非有理由使用其他容器,默认使用STL vector


Reason(原因)

vector and array are the only standard containers that offer the following advantages:

只有vector和array具有下面的优势:

  • the fastest general-purpose access (random access, including being vectorization-friendly);

    最快的一般目的访问(随机访问,包含矢量化友好)

  • the fastest default access pattern (begin-to-end or end-to-begin is prefetcher-friendly);

  • 最快的默认访问模式(从前到后,从后到前都对预抓取友好)

  • the lowest space overhead (contiguous layout has zero per-element overhead, which is cache-friendly).

  • 最小的空间代价(连续的内存布局没有任何多余元素,对缓存友好)

Usually you need to add and remove elements from the container, so use vector by default; if you don't need to modify the container's size, use array.

通常你需要对容器添加和移除元素,因此默认使用vector;如果你不需要修改容器长度,使用array。

Even when other containers seem more suited, such as map for O(log N) lookup performance or a list for efficient insertion in the middle, a vector will usually still perform better for containers up to a few KB in size.

即使其他容器看起来更合适,例如为了O(LogN)的搜索复杂度而考虑map,或者为更有效率的在中间插入元素,当长度在数KB之内时,通常vector仍然可以提供更好的性能。


Note(注意)

string should not be used as a container of individual characters. A string is a textual string; if you want a container of characters, use vector or array instead.

string不应该作为单独字符的容器使用,string就是文本字符串;如果你需要字符容器,使用vector 或者 array而不是std::string。


Exceptions(例外)

If you have a good reason to use another container, use that instead. 

如果你有充分理由使用其他容器,使用它。

For example(例如):

  • If vector suits your needs but you don't need the container to be variable size, use array instead.

    如果vector可以满足你的需求,但是你不需要长度可变,使用array。

  • If you want a dictionary-style lookup container that guarantees O(K) or O(log N) lookups, the container will be larger (more than a few KB) and you perform frequent inserts so that the overhead of maintaining a sorted vector is infeasible, go ahead and use an unordered_map or map instead.

    如果你需要字典风格的搜索容器保证O(K)或O(log N)复杂度的搜索,容器会更大(大于数KB)而且你需要频繁执行插入操作,从而无法导致无法维护有序vector,可以使用unordered_map或者map。


Note(注意)

To initialize a vector with a number of elements, use ()-initialization. To initialize a vector with a list of elements, use {}-initialization.

如果希望用元素数量初始化vector,使用()初始化形式。如果希望使用元素列表初始化数组,使用{}形式。

vector v1(20);  // v1 has 20 elements with the value 0 (vector{})
vector v2 {20}; // v2 has 1 element with the value 20

Prefer the {}-initializer syntax.

ES.23:优先使用{}初始化器语法

Enforcement(实施建议)

  • Flag a vector whose size never changes after construction (such as because it's const or because no non-const functions are called on it). To fix: Use an array instead.

    标记构造之后长度从来没有发生变化的vector(由于它本身为const或者没有非const函数使用它)。改正方法:使用array代替vector。


原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#slcon2-prefer-using-stl-vector-by-default-unless-you-have-a-reason-to-use-a-different-container


新书介绍

《实战Python设计模式》是作者最近出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。




觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!



浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报