4

有人可以详细解释一下为什么下面的 vectorY 代码会执行分配,但 VecY 的大小为零?此外,开始和结束迭代器卡在第一个节点。似乎保留仅适用于推回,如果您希望向量的迭代器和大小按预期工作,则需要构造具有大小的向量。我假设 push_back 正在执行某种类型的分配,而在这种情况下不是直接分配?我正在寻找解释这一点的详细信息,因此我可以确保我了解使用 reserve 和 push_back 与使用 size 元素构造然后像 VecX 示例中那样进行分配的情况。

#include <iostream>
#include <vector>

    int main ( int argc, char *argv[])
    {
      std::vector<int> vecX(2);
      vecX[0] = 1;
      vecX[1] = 2;
      std::cout << " VecX0 Item: " << vecX[0] << std::endl;
      std::cout << " VecX1 Item: " << vecX[1] << std::endl;
      std::cout << " VectorX Size: " << vecX.size() << std::endl;

      std::vector<int> vecY;
      vecY.reserve(2);
      vecY[0] = 1;
      vecY[1] = 2;
      std::cout << " VecY0 Item: " << vecY[0] << std::endl;
      std::cout << " VecY1 Item: " << vecY[1] << std::endl;
      std::cout << " VectorY Size: " << vecY.size() << std::endl;
    }

Output

 VecX0 Item: 1
 VecX1 Item: 2
 VectorX Size: 2
 VecY0 Item: 1
 VecY1 Item: 2
 VectorY Size: 0
4

2 回答 2

7
std::vector<int> vecY;
      vecY.reserve(2);
      vecY[0] = 1;
      vecY[1] = 2;

这段代码是错误的,会引发 Undefined Behavior 1。当你reserveavector时,你设置的是capacity,而不是size

您需要像示例 1 中那样push_back构建或构建。vector


未定义的行为”:这会调用未定义的行为,因为超出范围的调用operator[] 如果您调用vector::operator[n]where n > vec.size(),则行为是未定义的。

于 2013-07-18T14:53:12.213 回答
1

如果您不想使用push_back也不构造,请考虑使用resize方法

于 2016-10-07T19:30:53.913 回答