每个循环初始化一个向量

时间:2015-09-24 13:04:01

标签: c++ vector

当我声明一个向量时,它默认填充为零。作为模拟的一部分,我希望它能够在循环中初始化每个迭代。什么是正确有效的方法呢?

我想谈两个案例:

  1. 我希望将其归零为已知值,即nSteps

    #include <iostream>
    #include <vector>
    using namespace std;
    const int nSteps = 10000;
    const int nReal = 10;
    int main()
    {
        for (unsigned int i = 0 ; i<nRealization; i++)
        {
            vector<double> v(nSteps);
            for (unsigned int j = 0 ; j<nSteps ;  j++)
            {
                //stuff going on with v
            }
        }
    }
    
  2. 未定义长度(使用push_back的函数给出)

    #include <iostream>
    #include <vector>
    
    using namespace std;
    const int nSteps = 10000;
    const int nReal = 10;
    int main()
    {
        for (unsigned int i = 0 ; i<nRealization; i++)
        {
            vector<double> v;
            // some function that uses push_back gives v its length
    
            for (unsigned int j = 0 ; j<nSteps ;  j++)
            {
    
                //stuff going on with v
            }
        }
    }
    

3 个答案:

答案 0 :(得分:5)

文档是你的朋友。无论什么时候想做某件事,只需阅读标准库实用程序列表,直到找到the one you want

std::fill(v.begin(), v.end(), 0);

这基本上等同于老式的memset,但增加了类型安全性。

答案 1 :(得分:3)

正如Lightness Races in Orbit在他们的回答中所述,如果你不想让每个循环重新分配向量,那么你可以将向量移出循环然后使用std::fill来重新归零向量

int main()
{
    vector<double> v(nSteps);
    for (unsigned int i = 0 ; i<nRealization; i++)
    {
        std::fill(v.begin(), v.end(), 0); // reset to zero
        for (unsigned int j = 0 ; j<nSteps ;  j++)
        {
            //stuff going on with v
        }
    }
}

在你的第二个例子中,我建议你像在第一个例子中那样在循环之外声明向量,然后你只需要在每次迭代时清空向量,你可以用std::vector::clear

int main()
{
    vector<double> v;
    for (unsigned int i = 0 ; i<nRealization; i++)
    {
        v.clear(); // erase all elements
        // refill vector with function that uses push_back
        for (unsigned int j = 0 ; j<nSteps ;  j++)
        {
            //stuff going on with v
        }
    }
}

调用clear()不会改变向量的容量,因此这将减少每次迭代重用容量时的内存分配数量。现在有时候你可以使用一个容量大的矢量来处理几个元素,但是下次你需要那么大的容量它就会存在。

答案 2 :(得分:0)

我不太确定我理解你的问题,但你可以使用

 v.clear(); 
 v.resize(nSteps, initialValue);

将矢量重新初始化为给定的大小和值。 我认为这对你的两种情况都有效,你不需要push_back

但轻盈说,文档是你的朋友。