我想测试一个非空向量是否包含相同的元素。这是最好的方法吗?测试一个向量的所有元素是否相等
count(vecSamples.begin()+1, vecSamples.end(), vecSamples.front()) == vecSamples.size()-1;
我想测试一个非空向量是否包含相同的元素。这是最好的方法吗?测试一个向量的所有元素是否相等
count(vecSamples.begin()+1, vecSamples.end(), vecSamples.front()) == vecSamples.size()-1;
作为@约翰正确地指出,你的溶液迭代即使前两个元素是不同的,这是相当浪费整个容器。
纯粹不增强没有C++ 11需要的解决方案如何?
bool allAreEqual =
find_if(vecSamples.begin() + 1,
vecSamples.end(),
bind1st(not_equal_to<int>(), vecSamples.front())) == vecSamples.end();
停止找到第一个不相等的元素。 只要确保你的vecSamples在运行之前是非空的。
接受,因为我现在只使用旧的C++。 – 2013-03-21 11:33:18
或许不会,因为它总是检查向量的所有元素,即使前两个元素是不同的。就我个人而言,我只是写一个for循环。
在C++ 11(或Boost Algorithm)
std::all_of(vecSamples.begin()+1,vecSamples.end(),
[&](const T & r) {return r==vecSamples.front();})
我会将第一个元素的值减去所有向量元素,然后计算它们的总和并将其与零比较。
如果矢量不包含数字会怎么样?如果输入矢量是只读的呢? (我不得不复制它) – 2015-07-14 20:54:59
如果您的载体至少包含一个元素:
std::equal(vecSamples.begin() + 1, vecSamples.end(), vecSamples.begin())
它是简单的,肯定的,但是效率不高,如果它们是不同的。另外你可以通过去掉+/- 1来进一步简化它。特别是因为这会炸毁空载体。 – 2013-03-20 18:00:41
'vecSamples.front()'会在空载体上爆炸。 – john 2013-03-20 18:01:21
在我的情况下,矢量永远不会是空的。 – 2013-03-20 18:03:37