用map映射输出迭代器

时间:2013-11-18 11:51:47

标签: c++

#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/

为什么第一个评论行无效?

2 个答案:

答案 0 :(得分: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_iterator .. insert_iterator的{​​{1}}有点像黑客。它根本不是一个迭代器,你不能用它来迭代你的地图。它实际上只能用于将元素插入到地图中,但是它具有迭代器之类的运算符重载,因此它可以适用于算法。

答案 1 :(得分:0)

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