c++ - 将数组追加到 vector 中

标签 c++ c++11 vector

我认为这是一个微不足道的问题,但我找不到具体的解决方案。我正在尝试使用 push_back() 函数将数组追加到 vector 中。这是代码:

int main()
{
  std::vector<int*> matchVector;

  int msmTemp[3];

  msmTemp[0] = 1;
  msmTemp[1] = 2;
  msmTemp[2] = 3;
  matchVector.push_back(msmTemp);
  msmTemp[0] = 4;
  msmTemp[1] = 7;
  msmTemp[2] = 0;
  matchVector.push_back(msmTemp);

  for(auto i : matchVector)
  {
    for(int j = 0; j<3; j++)
    {
      cout<<i[j]<<", ";
    }
    cout<<"\n";
  }

  return 0;
}

我得到的输出是 4,7,0 两次。我不明白为什么我看不到以前的值,即 1、2、3?是不是因为上面定义的vector matchVector的类型?我认为它只需要是数组。

最佳答案

int* 是一个指向整数的指针。

int[3] 是一个包含 3 个整数的数组。

一个由 3 个整数组成的数组“衰减”到指向第一个元素的指针。

当您执行 push_back(msmTemp) 时,您会将指向 msmTemp 的第一个元素的指针插入 vector

C++ 中的指针不拥有它们指向的对象。两个 push_back 之后的 vector 包含两个指针,都指向同一个数组 msmTemp

当您稍后迭代该 vector 时,您将依次获得两个指针。每个都指向 msmTemp

然后您可以使用 [] 来索引这些指针。当您有指向数组第一个元素的指针时,您可以使用 [] 访问数组的其他元素。 [0] 是第一个元素,[1] 第二个,等等。

所以您查看 msmTemp 中的 3 个元素(幸运的是它有 3 个)并查看它们两次,因为您在 vector 中有两个指向它的指针。

你可以像这样注入(inject)元素:

std::vector<int> matchVector;
int msmTemp[3];
msmTemp[0]={1};
msmTemp[1]={2};
msmTemp[2]={3};
matchVector.insert( matchVector.end(), std::begin(msmTemp), std::end(msmTemp) );

等最终得到一个包含 6 个元素的 vector ,而不是两个数组。

如果你想要数组作为值,你需要std::array:

std::vector< std::array<int,3> > matchVector;
std::array<int, 3> msmTemp;

然后您的代码就可以正常工作了。 std::array 是一种类似于原始数组的库类型,但它没有原始数组的指针衰减问题。

关于c++ - 将数组追加到 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326004/

相关文章:

c++ - 填充整个小部件 opengl

c++ - std::pair 数组的聚合初始化

c++ - 如何在 C++ 中的两个类之间定义(重载)对称二元运算符,同时考虑 r 值?

algorithm - 将二次贝塞尔曲线转换为三次贝塞尔曲线

c++ - 数组与 vector : Introductory Similarities and Differences

关于异常处理的 C++ 建议

c++ - 类的构造函数中的 forward 和 move 有什么区别?

c++ - 在构造函数初始化器中使用 map 的初始化器列表

c++ - 尝试在 vector 类中创建调整大小函数

c++ - 插入 vector C++