2013-03-20 109 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()) 
相關問題