2013-03-20 69 views
2

我想测试一个非空向量是否包含相同的元素。这是最好的方法吗?测试一个向量的所有元素是否相等

count(vecSamples.begin()+1, vecSamples.end(), vecSamples.front()) == vecSamples.size()-1; 
+0

它是简单的,肯定的,但是效率不高,如果它们是不同的。另外你可以通过去掉+/- 1来进一步简化它。特别是因为这会炸毁空载体。 – 2013-03-20 18:00:41

+0

'vecSamples.front()'会在空载体上爆炸。 – john 2013-03-20 18:01:21

+0

在我的情况下,矢量永远不会是空的。 – 2013-03-20 18:03:37

回答

4

作为@约翰正确地指出,你的溶液迭代即使前两个元素是不同的,这是相当浪费整个容器。

纯粹不增强没有C++ 11需要的解决方案如何?

bool allAreEqual = 
    find_if(vecSamples.begin() + 1, 
    vecSamples.end(), 
    bind1st(not_equal_to<int>(), vecSamples.front())) == vecSamples.end(); 

停止找到第一个不相等的元素。 只要确保你的vecSamples在运行之前是非空的。

+2

接受,因为我现在只使用旧的C++。 – 2013-03-21 11:33:18

2

或许不会,因为它总是检查向量的所有元素,即使前两个元素是不同的。就我个人而言,我只是写一个for循环。

8

在C++ 11(或Boost Algorithm

std::all_of(vecSamples.begin()+1,vecSamples.end(), 
      [&](const T & r) {return r==vecSamples.front();}) 
-1

我会将第一个元素的值减去所有向量元素,然后计算它们的总和并将其与零比较。

+1

如果矢量不包含数字会怎么样?如果输入矢量是只读的呢? (我不得不复制它) – 2015-07-14 20:54:59

0

如果您的载体至少包含一个元素:

std::equal(vecSamples.begin() + 1, vecSamples.end(), vecSamples.begin()) 
相关问题