矢量< vector>:验证所有都具有相同的大小

时间:2014-02-18 14:12:03

标签: c++ algorithm vector

是否有std / boost算法来验证向量中的所有向量是否具有相同的大小?并且,通过扩展,所有元素的属性是相同的?

在下面的示例中,我使用了我正在寻找的假设std::all_equal

typedef std::vector<int> Line;
std::vector<Line> lines;
lines.push(Line(10));
lines.push(Line(11));

auto equalLengths = std::all_equal(lines.begin(), lines.end(), 
 [](const Line& x){ return x.size(); });

(并且扩展名为:

std::vector<MyClass> vec;
auto equal = std::all_equal(std::begin(vec), std::end(vec),
 [](const MyClass& x) { return x.property(); });

2 个答案:

答案 0 :(得分:9)

怎么样

auto const required_size = lines.front().size();
std::all_of(begin(lines), end(lines),
    [required_size](const Line& x){ return x.size() == required_size; }

不幸的是,对于空列表不起作用,你必须以某种方式在谓词中获得所需的大小。

答案 1 :(得分:2)

我喜欢@ ComicSansMS的答案,但是如果你想要一个稍微不那么清晰的方法也适用于空向量,你可以使用std::adjacent_find和自定义谓词:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<std::vector<int>> vv{{3, 1}, {4, 1}, {5, 9}};

    bool all_same_size = std::adjacent_find(
      vv.cbegin(), 
      vv.cend(), 
      [](const std::vector<int>& a, const std::vector<int>& b) {
        return a.size() != b.size();    // Look for two adjacent elements that
                                        // have different sizes
      }) == vv.cend();

    std::cout << "all same size: " << all_same_size << '\n';
}