2015-09-24 39 views
0

當我聲明一個向量時,它默認填充爲零。作爲模擬的一部分,我希望它在循環中初始化每個迭代。什麼是正確和有效的方式來做到這一點?每個循環初始化一個向量

我想解決兩種情況:

  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

回答

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

呼叫ing clear()不會改變向量的容量,所以這將減少你每次迭代重用容量時的內存分配數量。現在有些時候,您可以使用大容量的矢量來製作少量元素,但下一次需要更大的容量時,它將會在那裏。

+0

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

5

該文檔是您的朋友。只要你想做一件事,只需閱讀標準庫實用程序列表,直到找到the one you want

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

這基本上相當於一個老式memset,但增加了類型安全。

+0

@LightRacesinOrbit我已經改寫過這個問題 – jarhead

+0

@jarhead:嘖嘖,謝謝一堆。 –

0

我不太確定我明白你的問題,但你可以使用

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

重新初始化向量給定的規模和價值。 我認爲這將適用於您的兩種情況,並且您不需要push_back

但是,輕度說,文檔是你的朋友。