有这个向量
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
如何使用累积函数计算前半部分的总和(即 15)?
我可以使用仅带有迭代器(而不是数字索引)的 for 循环来执行此操作吗?
有这个向量
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
如何使用累积函数计算前半部分的总和(即 15)?
我可以使用仅带有迭代器(而不是数字索引)的 for 循环来执行此操作吗?
你可以
accumulate(v.begin(), v.begin()+int(v.size()/2), 0)
如果v
是你的向量。
你也可以写一个循环:
int sum = 0;
for (vector<int>::iterator it = v.begin(); it != v.begin+int(v.size()/2); ++it) {
sum += *it;
}
要仅使用前半部分,您必须获得仅涵盖该范围的迭代器。通常人们想要使用整个容器,所以他们使用 begin 和 end 函数,但这不是唯一的方法:
auto begin = std::begin(v);
auto middle = std::begin(v) + v.size()/2; // works for random access iterators
auto middle = begin;
std::advance(middle, v.size()/2);
Advance 适用于输入迭代器或更好,但对于不是其他类型之一的输入迭代器,高级传递的项目将不再可访问。
auto middle = std::next(begin, v.size()/2); // C++11. works for forward iterators
这些只是您可以在不同类型的迭代器上执行的一些可用操作。
因此,现在您可以创建指定所需范围的迭代器,您可以在 std::accumulate 或手动 for 循环中使用它们:
std::accumulate(std::begin(v), std::next(std::begin(v), v.size()/2), 0);
for (auto begin(std::begin(v)), end(begin+v.size()/2); begin!=end; ++begin) {
...
}
accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0);
int sum = std::accumulate(v.begin(), v.begin() + v.size() / 2, 0);