STL容器及其元素的构成 - 何时使用const

Constness of STL containers and their elements - when to use const?

本文关键字:何时使 const 元素 STL      更新时间:2023-10-16

我一直在思考过度(有些人可能会想到,让我们看看会发生什么)STL容器及其元素的constents。

我一直在寻找对此的讨论,但结果令人惊讶地稀疏。因此,我不一定在这里寻找明确的答案,我对使齿轮再次移动的讨论感到满意。

假设我有一个将std :: strings保留在std :: vector中的课程。我的班级是一本词典,它读取字典文件中的单词。他们将永远不会改变。因此,将其宣布为

似乎是谨慎的
std::vector<const std::string> m_myStrings;

但是,我已经阅读了分散的评论,您不应该在std :: vector中使用const元素,因为这些元素需要分配。

问题:

  • 是否存在const元素在std :: vector中使用const元素的情况(不包括hack等)?

  • 其他容器中使用的const元素吗?如果是这样,哪个以及何时?

我主要是在这里谈论价值类型,而不是指针。

我的班级是一个词典,它读取字典文件中的单词。他们永远不会改变。

封装可以在这里有所帮助。

让您的班级保持vector<string>,但要私有。然后在返回const vector<string> &的课程中添加一个访问者,然后使呼叫者通过。

呼叫者无法更改向量,并且向量上的 operator []将把它们交给const string &,这正是您想要的。

no ,出于您的陈述。

std::vector的上下文中,我认为使用具有模板参数的const限定符是没有意义的,因为std::vector本质上是动态的,并且可能需要"在内存中移动以"调整大小"本身。

在C 03标准中,std::vector保证存储在连续内存中。这几乎要求用某种形式的数组实现std::vector。但是,我们如何创建一个动态变化的数组?我们不仅可以仅将内存"附加"内存到其末尾 - 要么需要一个其他节点(和链接列表),也可以实际将我们的其他条目放在数组的末尾,这要么是不合时宜的界限或要求我们首先保留更多的内存。

因此,我认为std::vector需要分配一个额外的数组,将其成员复制或将其成员移至末端数组,然后删除旧的数组。

不能保证每个模板的移动或复制分配的std::vector not 更改所移动或复制的基础对象 - 它被认为是添加添加的好形式const预选赛,但不需要。因此,我们不能允许std::vector<const T>

相关:如何实现C std ::向量?

考虑使用

std::vector<std::shared_ptr<const std::string>> 

代替?