STL容器及其元素的构成 - 何时使用const
Constness of STL containers and their elements - when to use const?
我一直在思考过度(有些人可能会想到,让我们看看会发生什么)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>>
代替?
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 何时应在构造函数参数中使用 const C++?
- 何时使函数成为类成员函数C++?
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- "move"和"const ref&"如何使双丁吉过载起作用?
- 何时必须使操作员<<过载?
- 在lambda中捕获各种向量使元素const
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 将静态 const 成员重新声明为 constexpr 是否会自动使其符合内联条件
- STL容器及其元素的构成 - 何时使用const
- 继承,使基本成员变量const
- 如何使const char*函数起作用
- 使编译器假定 const primairy 类型作为类
- 自定义类的const实例化是否也会使类中的*everything*变为常量
- 为什么当 typedef const 指针与额外的 const 一起使用时,编译器不会给出错误?
- 如何使编译器在 const 未一致使用时至少发出警告
- 构造函数何时调用 const-expr
- 如何使const应用于c++类的共享指针成员
- 何时使用const char *,何时使用const char[]
- 使'const'使用类型特征的结果