【发布时间】:2020-07-06 13:40:18
【问题描述】:
我有一个简单的结构
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;
});
});
或者我可以为
写一个简单的doublefor (const auto& vec : v)
{
for (const auto& p : vec)
{
sum += p.x;
}
}
而且它看起来更具可读性(imo)。 我应该改变什么以使 std::accumulate 的使用具有更好的可读性?或者在这种情况下不适用。当您拥有多于一维的容器时,是否普遍适用 STL?
【问题讨论】:
-
多维
std::vectors 效率有点低,最好使用带有为您实现索引的包装类的单维向量,这也将简化标准算法的使用 -
拥有多维容器只是表示数据的一种方式。属于一起的 IMO 数据通常应该在同一个容器中。如果您需要该数据的多维表示,您可以这样做并且仍然将数据存储在单个向量中。
-
我应该改变什么以使 std::accumulate 的使用具有更好的可读性? 恕我直言,没什么。我知道那里有建议说不要使用原始循环,但恕我直言,基于范围的 for 循环不是原始循环。它扩展到使用迭代器,变量是实际的当前元素,因此您使用的项目没有错误。在这种情况下,它们会使代码更加简洁易懂。
-
是的,使用 C++11 标准,基于范围的 for 循环似乎是最好的方法。但是来自 C++20 的 range-v3 看起来很棒,让它成为带有“累积”字样的单行。