如何在循环的每次迭代期间生成向量,存储数据,然后删除该向量?

时间:2018-04-13 22:30:35

标签: c++ loops vector

我想在我的程序中创建一个向量向量。我希望有一个双循环;内部循环检查某个条件,如果满足该条件,则在我的向量中存储一个值。一旦内循环运行,那个“临时”矢量就存储在主矢量中。我的想法是清除我的“临时”(内部)向量,但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();它只输出空行。

我做错了什么,我怎样才能实现我想做的事情?谢谢!

2 个答案:

答案 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; } } 的清除应该按预期工作。