通过迭代器对map的元素求和

sum elements of map by iterator

本文关键字:元素 求和 map 迭代器      更新时间:2023-10-16

我想用iteratorc++中求和map的前四个元素。

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
}

您可以从<algorithm>头使用std::accumulate:

std::accumulate(it, std::next(it,4), 0, 
                [](const auto& a, const auto& b){return a + b.first;});

不要在迭代器中使用+。它只对随机访问迭代器有意义,但没有理由任意限制自己(事实上,这意味着您的代码无法工作,因为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,否则执行循环。

用一点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;
}