是否有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(); });
)
答案 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';
}