我想在我的程序中创建一个向量向量。我希望有一个双循环;内部循环检查某个条件,如果满足该条件,则在我的向量中存储一个值。一旦内循环运行,那个“临时”矢量就存储在主矢量中。我的想法是清除我的“临时”(内部)向量,但vector.clear()也删除了我的主向量中的所有内容。这是我的矢量代码:
vector <int> vectortestInner;
vector <vector<int> > vectortestOuter(10);
我在这里填充了我的载体:
void vectorTest()
{
for (int i=0; i<vectortestOuter.size(); i++)
{
for (int j=0; j<vectortestOuter.size(); j++)
{
vectortestInner.push_back(j);
}
vectortestOuter[i]=vectortestInner;
//vectortestInner.clear();
}
}
并尝试打印如下内容:
for(int i=0; i<vectortestOuter.size(); i++)
{
for (int j=0; j<vectortestInner.size(); i++)
{
cout<<vectortestInner[j]<<endl;
}
}
到目前为止,它似乎是打印0,(当我想打印1-10时),如果我调用clear();它只输出空行。
我做错了什么,我怎样才能实现我想做的事情?谢谢!
答案 0 :(得分:3)
填充(或重新填充,因为你的第一个功能可以做什么
// remove any global declaration of vectortestInner since we won't use it
void vectorTest()
{
for (int i=0; i<vectortestOuter.size(); i++)
{
std::vector<int> vectortestInner;
vectortestInner.reserve(vectortestOuter.size());
for (int j=0; j<vectortestOuter.size(); j++)
{
vectortestInner.push_back(j);
}
vectortestOuter[i]=vectortestInner;
// vectortestInner ceases to exist here
}
}
这在外部循环的每次迭代中本地构造vectorTestInner
,因此它也将在迭代结束时被破坏。 reserve()
调用避免了多次调整大小(但特定于您的内部循环总是会附加vectortestOuter.size()
元素)。
是的,每次重建vectortestInner
。但这实际上并不比每次清理和重新填充更糟糕(因为这些是在建筑和破坏中最重要的操作)。
要打印向量矢量的元素,实际上需要引用它们。你的代码有一个缺陷(不知何故)你假设vectorTestInner
神奇地提供了一种访问vectorTestOuter
元素的方法。事实并非如此。
for(int i=0; i<vectortestOuter.size(); i++)
{
for (int j=0; j<vectortestOuter[i].size(); j++) // also using j++ here, not i++
{
cout<<vectortestOuter[i][j]<<endl;
}
}
我还没有解决您的代码中的其他低效问题。而不是使用[]
考虑使用迭代器。我将此作为练习。
答案 1 :(得分:1)
您正在内部循环中打印临时矢量($serializer
),而不是主矢量(vectortestInner
)中包含的矢量。
vectortestOuter[i]
随着打印功能的改变,for(int i=0; i<vectortestOuter.size(); i++)
{
for (int j=0; j<vectortestOuter[i].size(); j++)
{
cout<<vectortestOuter[i][j]<<endl;
}
}
的清除应该按预期工作。