2013-11-21 167 views
3

如何檢查向量中的每個單個元素是否爲零而不循環遍歷它們?檢查整個向量是否爲零

當前我有(半MEW形式): 這個試圖做的是檢查最終向量(它的三維...年份)的全部三個值是否全爲零(在原點處) ,或者它與所有三個值上的任何先前的矢量相等。

 siteVisited = false; counter = 0; 
     while (counter < (walkHist.back().size()-1)) 
     { 
      tdof = 1; 
      while (tdof <= dimensions) 
      { 
       if (walkHist.back().back().at(tdof-1) == 0) 
       { 
        siteVisited = true; 
       } 
       else 
       { 
        siteVisited = false; 
        break; 
       } 
       tdof++; 
      } 
      if (siteVisited) 
      { 
       goto visited; 
      } 

      tdof = 1; 
      while (tdof <= dimensions) 
      { 
       if (walkHist.back().back().at(tdof-1) == walkHist.back().at(counter).at(tdof-1)) 
       { 
        siteVisited = true; 
       } 
       else 
       { 
        siteVisited = false; 
        break; 
       } 
       tdof++; 
      } 
      if (siteVisited) 
      { 
           visited: 
       ... 
      } 
      counter++; 
     } 

回答

19

這取決於你的意思是什麼循環,而這會工作:

bool zeros = std::all_of(v.begin(), v.end(), [](int i) { return i==0; }); 
+1

的'all_of'算法具有額外的好處,它可能提前退出,如果一個元素不爲0,節省一些不必要的檢查。 – Steve

+0

@Steve其實,'count'的例子很糟糕,因爲你提到的原因。我刪除它。 – juanchopanza

1

的原因檢查是需要了解的重要。如果一個歸零數組很重要,並且定期檢查,那麼無論何時添加或更改一個值,都值得向子分類向量設置一個標誌。這會增加所有添加的開銷,刪除和修改,但會使「一切爲零」測試快速。

如果您的數組經常歸零,那麼可能值得編寫您自己的稀疏數組類(可能基於映射)。當添加非零項目時,或者元素更改爲非零時,會將其輸入到地圖中。當改爲0時,它被刪除。現在你知道所有的元素是否爲零,因爲地圖是空的。這也將有利於使用更少的內存。

但是,如果對零數組進行檢查比較少見,那麼任何在非零處打破的循環都可以正常工作。但是,它確實意味着最慢的檢查將全部爲零,這值得記住。

+0

它是一個n維自我意識的隨機遊走。我必須檢查它是否徘徊回原點。 – NictraSavios

+0

所以問題是你需要多久才能知道這個問題,它有多可能。如果不太可能,那麼很可能所有的n維都是非零的,所以非零中斷的循環通常只會測試一個元素。如果它很常見,並定期檢查,那麼某種形式的簡單測試就更有意義。 –

+0

它需要檢查每一步。 (通常我跑10^3步10^9步),所以測試是最有意義的。 – NictraSavios

0

您還可以檢查它是否等於一個零向量:

if(myVector == copyVector(myVector.size(), 0)){//this is a zero vector, do stuff}