我认为这是一个微不足道的问题,但我找不到具体的解决方案。我正在尝试使用 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/