迭代器对map的元素求和

时间:2015-06-04 08:36:19

标签: c++ dictionary iterator

我想在 c ++ 中使用mapiterator的前四个元素求和。

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

}

3 个答案:

答案 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 / prevadvance适用于所有迭代器,它们在内部调度到最有效的操作。例如。 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;
}