2011-08-29 109 views
1

我正在嘗試使用迭代器遍歷一個集合,然後對該集合的成員(如果有的話)執行某些操作。問題是,通常這是有效的,但有時候,它會比較空集的開始和結束,並發現它們不相等。在C++中使用begin()和end()

感興趣的代碼段是:

for(int i=0;i<input_data.num_particles();i++) 
    { 
     //loop through pairs contained in particle i's Verlet list 
     set<int>::iterator iter; 
     for(iter=verlet_vars.verlet()[i].begin();iter!=verlet_vars.verlet()[i].end();iter++) 
     { 
      //call the force() function to calculate the force between the particles 
      force(particles.getpart(i),particles.getpart(*iter),input_data,*iter); 
     } 
    } 

有時,即使)載於verlet_vars.verlet(設定的[i]是空的,程序迭代進行比較,以設定的端部,並發現它們不相等,因此它進入內部循環(最終通過嘗試調用force()函數導致程序崩潰)。什麼是奇怪的是,如果我做任何迭代器內循環調用之前,喜歡做這樣的事情:

iter=verlet_vars.verlet()[i].begin(); 

那麼,對於內環的比較總是返回true,程序正常運行。

P.S.命令verlet_vars.verlet()[I]調用的集合的矢量,因此[I]

的verlet的()函數:

std::vector<std::set<int> > verlet() const {return _verlet;} 

感謝您的時間。

+0

這是一個單線程程序嗎? 'force()'或'getpart()'是否修改集合? –

+1

您確定要使用'input_data'來確定'verlet_vars.verlet()'中的元素個數嗎?爲什麼不從0到'verlet_vars.verlet()。size()'? –

+0

我們可以看到verlet()函數嗎? –

回答

8

verlet_vars.verlet()通過值函數返回,所以你確實有套在播放兩個不同的載體。 Comparing iterators of two different containers is undefined.這意味着代碼的某些安排可能總能正常工作,但如果確實如此,您仍然是幸運的。

一些替代方案:

  • 使函數返回一個向量參考,而不是:

    std::vector<std::set<int> > const& verlet() const {return _verlet;} 
    
  • 調用該函數一旦獲得向量的本地副本(或一組),然後在迴路中處理本地副本:

    std::set<int> verlet_i = verlet_vars.verlet()[i]; 
    set<int>::iterator iter; 
    for(iter=verlet_i.begin();iter!=verlet_i.end();iter++) 
    
+2

你可能想要返回const參考 –

+0

好眼Rob,永遠不會想到了這一點。 +1 –

+0

作爲一個常數引用返回似乎有固定的問題。非常感謝。 – Kyle

0

它可能並不重要,具體取決於您的編譯器是否複製或返回值。您應該在返回類型verlet()上使用const引用。如果不是這樣,你可能最終會在每次調用時接收到不同的副本,(取決於實現)可能導致迭代器沒有完全比較(例如,將集合的迭代器與另一個集合的結束迭代器進行比較,因爲每個當你打電話給verlet()你得到一套不同的副本。)

相關問題