STL算法函数在多个一维容器上的使用

  • 本文关键字:一维 函数 算法 STL c++ stl
  • 更新时间 :
  • 英文 :


我有一个简单的结构

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的现状,那么循环的嵌套范围可能是最可读的(尽管它仍然是主观的(。

然而,我非常提倡不使用循环的范围,除非您需要transformfor_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);

这是一个演示。

最新更新