【问题标题】:Output interator with map带映射的输出迭代器
【发布时间】:2013-11-18 11:51:47
【问题描述】:
#include <iostream> 
#include <algorithm>    
#include <map>     
#include <iterator>

int main()
{
   typedef std::map<int, int> Key2NodeMap;
   Key2NodeMap first;
   first[1] = 2;
   first[2] = 2;
   first[3] = 3;
   first[4] = 2;

   Key2NodeMap second;
   second[1] = 1;
   second[2] = 2;
   second[3] = 3;
   second[4] = 2;

   Key2NodeMap m;

   ///std::set_difference(first.begin(), first.end(),
   ///                    second.begin(), second.end(), m.begin());

   ///std::set_difference(first.begin(), first.end(),
   ///                    second.begin(), second.end(), std::inserter(m, m.end()));

  return 0;
}

map.begin() 返回迭代器是双向迭代器。 “所有不是常量迭代器的前向、双向和随机访问迭代器也是有效的输出迭代器。” --- http://www.cplusplus.com/reference/iterator/OutputIterator/

为什么第一行注释无效?

【问题讨论】:

  • 据我所知错误信息:note: synthesized method 'std::pair&lt;const int, int&gt;&amp; std::pair&lt;const int, int&gt;::operator=(const std::pair&lt;const int, int&gt;&amp;)' first required here *__result = *__first1; 问题是键类型是const int,因此无法分配对值。因此,您必须使用插入器进行调整。

标签: c++


【解决方案1】:

它不是一个有效的输出迭代器,因为你不能分配给它,即你不能这样做:

*m.begin() = std::make_pair( 1, 1 );

实际上,迭代器(甚至是常规迭代器)中的“关键”是 const,因此错误是破坏了 constness。 const_iterator 也有一个 const 值。

当然,这是因为如果您可以只覆盖映射中的键,则会破坏完整性,即不再保证保存具有唯一键的排序树。

尝试插入地图的正确方法是通过

m.insert( std::make_pair( 1, 1 ) );

insert 还允许您提供一个“提示”迭代器,说明它可能插入的位置。 (如果这个提示是正确的地方,它会使插入成为常数时间而不是 O(log N) )。

提供的std::inserter 函数会为您的地图创建insert_iteratorinsert_iterator 用于map 有点小技巧。它根本不是一个真正的迭代器,你不能用它来迭代你的地图。它实际上只能用于将元素插入到您的地图中,但具有像迭代器这样的运算符重载,因此它可以适应算法。

【讨论】:

  • 如果使用矢量而不是地图,可以。
  • 只有当您正在写入的迭代器已经存在时,它才与向量一起使用,即向量已经具有足够的大小(保留不够),在这种情况下,这些元素将被新值覆盖。 std::vector 中的迭代器是完全可变的,即您可以写入它们。在 map 中,const_iterator 具有 const 一切,非 const 迭代器具有 const 键和可变值。
  • 感谢 CashCow。我在 SGI-STL 文档中得到了解释。
【解决方案2】:

Pair Associative Container 是将键与其他对象相关联的关联容器。 Pair Associative Container的值类型是pair。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 2021-04-15
    • 2011-07-31
    • 2011-08-06
    • 2011-04-02
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多