将数组追加到向量中

arc*_*ity 2 c++ vector c++11

我认为这是一个琐碎的问题,但是我找不到针对它的具体解决方案。我正在尝试使用push_back()函数将数组追加到向量中。这是代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Yak*_*ont 5

A int*是指向整数的指针。

An int[3]是3个整数的数组。

3个整数的数组在指向第一个元素的指针的帽子放下时“衰减”。

当你这样做push_back(msmTemp),你推指针的第一个元素msmTemp进入vector

C ++中的指针不拥有其指向的内容。两个push_backs之后的向量包含两个指针,都指向同一array msmTemp

稍后在向量上进行迭代时,您将依次得到两个指针。每个指向msmTemp

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

因此,您查看了其中的3个元素msmTemp(幸运的是,它包含3 个元素)并对其进行了两次查看,因为向量中有两个指针。

您可以注入如下元素:

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) );
Run Code Online (Sandbox Code Playgroud)

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

如果要将数组作为值,则需要std::array

std::vector< std::array<int,3> > matchVector;
std::array<int, 3> msmTemp;
Run Code Online (Sandbox Code Playgroud)

然后您的代码将按编写的方式工作。 std::array是一种库类型,其行为有点像原始数组,但是它没有原始数组的指针衰减问题。