我认为这是一个琐碎的问题,但是我找不到针对它的具体解决方案。我正在尝试使用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上面定义的向量类型?我认为它只需要数组。
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是一种库类型,其行为有点像原始数组,但是它没有原始数组的指针衰减问题。
| 归档时间: |
|
| 查看次数: |
1683 次 |
| 最近记录: |