【问题标题】:sum elements of map by iterator通过迭代器对 map 的元素求和
【发布时间】:2015-06-04 08:36:19
【问题描述】:

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

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

}

【问题讨论】:

  • 您的代码会导致大量复制。从您的配对到地图的value_type,这是完全不必要的转换。为什么不numbers.emplace(2, "two")
  • 您遇到的问题是什么?只是说“问题就在这里”而不告诉我们问题是什么并不能告诉我们太多。你有构建错误吗?运行时错误?出乎意料的结果?是你不知道如何添加的问题吗?不知道循环好不好?完全不同的东西?

标签: c++ dictionary iterator


【解决方案1】:

您可以使用&lt;algorithm&gt; 标头中的std::accumulate

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

【讨论】:

    【解决方案2】:

    不要将+ 用于迭代器。它只对随机访问迭代器有意义,但没有理由任意限制自己(实际上这意味着您的代码不起作用,因为映射迭代器不是随机访问)。而是使用&lt;iterator&gt;提供的设施:

    #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,否则执行循环。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多