STL容器及其元素的常量 - 何时使用const?

时间:2015-05-14 09:33:37

标签: c++ c++11 vector stl const

我一直在思考STL容器及其元素的持久性(有些人可能会说是未经证实,让我们看看会发生什么)。

我一直在寻找对此的讨论,但结果却令人惊讶地稀疏。所以我不一定在这里寻找一个明确的答案,我会对那些让我的脑袋再次移动的讨论感到高兴。

让我们说我有一个类将std :: strings保存在std :: vector中。我的类是一个从字典文件中读取单词的字典。它们永远不会改变。所以将它声明为

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

但是,我读过散乱的评论,你不应该在std :: vector中使用const元素,因为元素需要是可分配的。

问题:

  • 有没有在std :: vector中使用const元素的情况(不包括hacks等)?

  • const元素是否在其他容器中使用?如果是,那些,何时?

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

4 个答案:

答案 0 :(得分:4)

  

我的类是一个从字典文件中读取单词的字典。它们永远不会改变。

封装可以在这里提供帮助。

让您的班级保持vector<string>,但将其设为私有。 然后为您的类添加一个返回const vector<string> &的访问器,并让调用者完成该访问。

调用者无法更改向量,向量上的operator []会将它们const string &交给他们,这正是您想要的。

答案 1 :(得分:2)

,因为你陈述的原因。

答案 2 :(得分:2)

std::vector的上下文中,我认为使用const限定符及其模板参数是有意义的,因为std::vector本质上是动态的可能需要&#34;移动&#34;在记忆中,以便&#34;调整大小&#34;本身。

在C ++ 03标准中,std::vector保证存储在连续的内存中。这几乎要求std::vector以某种形式的数组实现。但是,我们如何创建一个动态的大小改变数组呢?我们不能简单地追加&#34;追加&#34;内存到它的末尾 - 要么需要一个额外的节点(和一个链表),要么实际上将我们的附加条目物理地放在数组的末尾,这将是超出界限或要求我们保留首先是更多的记忆。

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

无法保证std::vector的每个可模板对象的移动或复制分配都更改正在移动或复制的基础对象 - 它被视为良好形式要添加const限定符,但不是必需的。因此,我们不能允许std::vector<const T>

相关:How is C++ std::vector implemented?

答案 3 :(得分:-1)

考虑使用

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

代替?