【问题标题】:vector<const int> is not allowed. What about map<const int, int>, etc.? [duplicate]不允许使用 vector<const int>。 map<const int, int> 等呢? [复制]
【发布时间】:2012-12-07 17:56:41
【问题描述】:

可能重复:
Why does stack<const string> not compile in g++?

我们知道vector&lt;const int&gt; 是不允许的。

但是map&lt;const int, int&gt;map&lt;int, const int&gt;map&lt;const int, const int&gt; 是否允许?

为什么(不)?

【问题讨论】:

  • 游戏很有趣,不是吗?
  • 'Dennis Ritchie' 是个大胆的昵称 ;) ...
  • 你需要这些东西是为了做什么?
  • 查看我对您上一个问题的回答,我对其进行了编辑以涵盖这个问题。
  • 你的思维模式是正确的。但这是实现它的错误方法。使用map/vector的原因是不同的(选择应该基于访问特性)。如果您不想在通过 const 引用传递向量的函数中更改向量的任何成员。如果您提供有关您的确切问题的更多详细信息,也许我们可以建议一个更好的替代方案来实现您的确切目标,同时仍然为您提供 vector 提供的适当访问特性。

标签: c++


【解决方案1】:

向量中的项必须是可复制构造的或(从 C++11 开始)可移动构造的。

地图中的键只需要是可破坏的,而不是可复制/移动可构造的,因此这方面的要求要宽松得多。

至于为什么,这很简单:当/如果调整向量的大小时,必须将现有缓冲区中的数据复制或移动到新缓冲区中。相比之下,地图通常将其内容存储为树中的节点。一旦创建了一个节点,它就会一直存在,直到它被销毁。虽然树有时确实需要平衡,但只需要在节点之间操作指针——节点中的键在节点创建后永远不会被修改。

【讨论】:

    【解决方案2】:

    您需要能够为存储在 STL 容器中的项目插入副本,这就是不允许这样做的原因。

    您仍然可以使用 const 引用导出容器,以便通过类方法 (getter) 中的 const_iterator 进行只读访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2012-05-03
      • 2020-12-14
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多