我有一个像这样定义的地图
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 ......但我不确定。
我应该转移到函数对象(来自普通函数指针)吗?
任何帮助?
答案 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());
这将起作用,并且顶部元素将在任何时间点返回。