我想在 c ++ 中使用map
对iterator
的前四个元素求和。
map<int, string> numbers; //making object of map
numbers.insert(pair<int, string>(2,"two")); //inserting values into map
numbers.insert(pair<int, string>(3,"two")); //inserting values into map
numbers.insert(pair<int, string>(4,"two")); //inserting values into map
numbers.insert(pair<int, string>(7,"two")); //inserting values into map
numbers.insert(pair<int, string>(5,"two")); //inserting values into map
map<int, string>::iterator it;
it=numbers.begin();
for( ;it!=numbers.begin()+4; it++){ //problem is here and in body
}
答案 0 :(得分:3)
您可以使用std::accumulate
标题中的<algorithm>
:
std::accumulate(it, std::next(it,4), 0,
[](const auto& a, const auto& b){return a + b.first;});
答案 1 :(得分:2)
不要将+
用于迭代器。它只对随机访问迭代器有意义,但没有理由任意限制自己(实际上它意味着你的代码不起作用,因为map迭代器不是随机访问)。相反,请使用<iterator>
:
#include <cassert>
#include <iterator>
// ...
assert(numbers.size() >= 4);
for (auto it = numbers.begin(), e = std::next(it, 4); it != e; ++it)
{ // ^^^^^^^^^^^^^^^^^^^^
acc += it->first;
}
迭代器算术next
/ prev
和advance
适用于所有迭代器,它们在内部调度到最有效的操作。例如。 advance(it, n)
为随机访问迭代器执行it += n
,否则执行循环。
答案 2 :(得分:0)
有点c ++ 11,如果我理解了你想要总结的东西,你可以这样做:
std::map<int, std::string> numbers = {
{2,"two"},
{3,"two"},
{4,"two"},
{7,"two"},
{5,"two"}
}; //Better initialisation
std::string sum = "";
for(auto it = std::begin(numbers); it != std::next(std::begin(numbers),4); ++it)
{
sum += it->second;
}