【问题标题】:is it portable to treat std::vector like array [duplicate]像数组一样对待 std::vector 是否可移植?
【发布时间】:2013-11-12 17:27:49
【问题描述】:

我看到我的团队中有人编写这样的代码。我个人认为这不是可移植的,因为向量可以以完全不同的方式实现。我说的对吗?

vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);

int* b = &a[0];
std::cout<< *(b +1); // this will print 2

【问题讨论】:

  • 事实上,截至 2011 年,data 成员函数正是用于此目的。
  • @BoBTFish 因为data 有一个const 限定符,所以b 需要声明为const int* b
  • @Mark 第二个。现在,让我们也为最初的问题投票。

标签: c++ arrays pointers vector


【解决方案1】:

该代码是正确的。从 C++03 开始​​,保证存储在 std::vector 中的元素是连续存储的。

这是当前标准 C++ 草案N3797 (23.3.6.1) 的相关部分:

向量是支持随机访问的序列容器 迭代器。此外,它支持(摊销)恒定时间插入 最后进行擦除操作;在中间插入和擦除 线性时间。存储管理是自动处理的,尽管有提示 可以给予提高效率。 向量的元素是 连续存储,这意味着如果 v 是一个向量,其中 T 是一些 类型不是 bool,则它服从标识 &amp;v[n] == &amp;v[0] + n 对于所有0 &lt;= n &lt; v.size()

【讨论】:

    【解决方案2】:

    无论以何种方式实现向量,标准都保证某些事情保持一致。 std::vector 始终连续存储在内存中,这就是它可以与随机访问迭代器一起使用的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多