2013-11-21 73 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}