std :: map上的make_heap,用户定义的比较&随机访问迭代器

时间:2014-03-18 12:10:16

标签: c++ data-structures stl heap function-object

我有一个像这样定义的地图

std::map<int,int> myMap;

处理完这张地图后,我想把它当作一堆(基于第二个值)。我决定使用std :: make_heap函数..这个定义如下......

template< class RandomIt, class Compare > void make_heap( RandomIt first, RandomIt last, Compare comp );

由于此功能需要定义比较功能......我这样做了

bool compare(const std::pair<int,int> &frst, const std::pair<int,int> &scnd)

现在有了这个设置,我就像这样调用make_heap

std::make_heap(myMap.begin(), myMap.end(),compare);

但是这给了我编译错误......

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_heap.h: In function ‘void std::make_heap(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_Rb_tree_iterator<std::pair<const int, int> >]’:
maxRepeatingNumber.cc:48:   instantiated from here /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_heap.h:357: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include e/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/ c++/4.1.2/bits/stl_heap.h:360: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_heap.h:364: error: no match for ‘operator+’ in ‘__first + __parent’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&)

编译错误给了我一个提示,可能是因为make_heap需要random_access_iterator ......但我不确定。

我应该转移到函数对象(来自普通函数指针)吗?

任何帮助?

2 个答案:

答案 0 :(得分:3)

您无法直接在地图上创建堆。地图已按键排序,您需要进行不同的部分排序。您可以将所有地图值复制到矢量并从中创建堆。

编辑:

如果您需要修改映射并维护堆,当其中一个索引实际上是堆驱动的时,您可以实现多索引容器之类的东西。

答案 1 :(得分:0)

同意@Andy。映射已按键排序,因此您无法直接在其上堆积。为了解决类似的问题,我创建了一个对的向量,其中map值为第一个元素,key为第二个元素,然后make heap。它不需要任何最大堆的压缩器参数。

例如:对于地图&#34;地图m&#34;使用下面的代码创建向量,然后创建堆。

for(it=m.begin(); it != m.end(); it++)
    v.push_back(make_pair(it->second,it->first));   

make_heap(v.begin(),v.end(),sort_v());

这将起作用,并且顶部元素将在任何时间点返回。