我有一个简单的结构
struct Point
{
Point(int x, int y)
: x(x)
, y(y)
{}
int x, y;
};
和一个二维矢量(也可以是三维矢量或更多(
std::vector<std::vector<Point>> v(10, std::vector<Point>(10, Point(3, 4)));
我想知道所有x值的汇总。我可以使用std::accumulate,它看起来像
int sum = std::accumulate(v.begin(), v.end(), 0, [](int init, const auto& vec)
{
return init + std::accumulate(vec.begin(), vec.end(), 0, [](int init, Point p)
{
return init + p.x;
});
});
或者我可以为写一个简单的替身
for (const auto& vec : v)
{
for (const auto& p : vec)
{
sum += p.x;
}
}
它看起来更可读(imo(。我应该更改什么以使std::accumulate的用法具有更好的可读性?或者在这种情况下不适用。当你有不止一个维度的容器时,通常使用STL是否适用?
如果考虑STL的现状,那么循环的嵌套范围可能是最可读的(尽管它仍然是主观的(。
然而,我非常提倡不使用循环的范围,除非您需要transform
或for_each
。如果代码正在执行accumulate
,那么您应该编写accumulate
。
以下是我今天将如何在range-v3的帮助下编写这段代码。不久之后,STL将允许您编写可读的代码。
namespace rs = ranges;
namespace rv = ranges::views;
int sum = rs::accumulate(v | rv::join, 0, std::plus{}, &Point::x);
这是一个演示。