每个循环初始化一个向量

问题描述:

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

我想解决两种情况:

  1. 我想它被归零到一个已知的值,即

    #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. 的长度没有限定n步(它被赋予与使用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 
         } 
        } 
    } 
    
+0

你能否让你的例子更清楚?请包括你期望在每种​​情况下矢量的最终状态;即它应该具有什么长度和内容。 –

+0

@DanHulme,第一个案例已经有答案 – jarhead

+0

@DanHulme,在第二个案例中究竟有什么不明确的地方? – jarhead

由于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 
     } 
    } 
} 

呼叫ing clear()不会改变向量的容量,所以这将减少你每次迭代重用容量时的内存分配数量。现在有些时候,您可以使用大容量的矢量来制作少量元素,但下一次需要更大的容量时,它将会在那里。

+0

太好了,谢谢你的回答 – jarhead

该文档是您的朋友。只要你想做一件事,只需阅读标准库实用程序列表,直到找到the one you want

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

这基本上相当于一个老式memset,但增加了类型安全。

+0

@LightRacesinOrbit我已经改写过这个问题 – jarhead

+0

@jarhead:啧啧,谢谢一堆。 –

我不太确定我明白你的问题,但你可以使用

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

重新初始化向量给定的规模和价值。 我认为这将适用于您的两种情况,并且您不需要push_back

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