map :: const_iterator以c ++格式映射

时间:2011-08-22 15:29:03

标签: c++ map

我在C ++中有一个Map :: const_iterator对象,我试图从中抽象整个地图对象,而不是先用Map :: const_iterator->和Map :: const_iterator->第二个显式创建一个地图。 / p>

这似乎不起作用:(* Map :: const_iterator).as_map() 请建议。

2 个答案:

答案 0 :(得分:3)

我害怕我完全理解这个问题。如何使用它 - >第二个?

 typedef .... mymap_t;
 typedef std::map<std::string, mymap_t> supermap_t;

 supermap_t supermap;


 for (supermap_t::const_iterator it = supermap.begin();
          it != supermap.end();
          ++it)
 {
     const mymap& the_sub_map = it->second;
     call_some_other_function(the_sub_map); // the whole submap
 }

<击> <子> 从问题来看,很难弄清楚你真正需要什么,但我猜你正在寻找一种方法来将迭代器范围视为容器,而不必复制容器。

<击>

请查看Boost Range

 typedef map<int, string> mymap_t;

 mymap_t mymap;
 mymap[1] = "One";
 mymap[2] = "Two";
 mymap[3] = "Three";

 mymap_t::const_iterator first(my_map.begin()), 
                         last(my_map.end());

 boost::sub_range<mymap_t> subrange(first++, last); // contains two items

您可以将subrange视为具有提升范围算法的“容器”类。

这是否接近您想要问的内容?

更新

似乎你在此之后:

 typedef map<int, string> mymap_t;

 void somefunction(mymap_t::const_iterator first, mymap_t::const_iterator last)
 {
     mymap_t subclone(first, last);

     // use subclone -- it is a mymap_t now :)
 } 

 mymap_t mymap;
 mymap[1] = "One";
 mymap[2] = "Two";
 mymap[3] = "Three";

 somefunction(mymap.begin(), mymap.end());

<击>

答案 1 :(得分:1)

这对你解释它的方式没有任何意义。

Map :: const_iterator在Map类中定义。如果没有基于Map的内部实现定义的map类,它就不应该存在。

你可以使用const_iterator和.first .second循环浏览地图,如果你愿意,可以从地图中获取整个内容,但你不能假装地图不在那里。

如果您希望创建一个可以使用任意迭代器和容器并处理它们的函数,那么您不希望使用.first和.second,因为map是唯一具有这些成员的STL容器,因为它们可以处理对。您可以通过制作模板专业化来详细说明如何处理特定类型来解决这个问题。

因此,您的普通模板代码将处理任何类型,但如果它是一个地图,您的专业化可以处理它并特别使用.first和.second,并且仅在这种情况下。如果你要沿着这条路前进,虽然你需要对你用于算法的每种类型的地图进行专业化 - 你应该重新考虑你的设计,然后走另一条路:(