make_heap 在 std::map 上使用用户定义的比较和随机访问迭代器
make_heap on std::map with user defined comparison & random access iterator
我有一个这样定义的map
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…但我不确定。
我应该移动到函数对象(从普通函数指针)?
帮忙吗?
不能直接在映射上创建堆。Map已经按键排序了,你需要一个不同的部分排序。你可以将所有的map值复制到一个vector中,并从中创建一个堆。
编辑:如果你需要修改你的映射和维护堆,你可以实现像多索引容器这样的东西,当其中一个索引实际上是堆驱动的。
同意@Andy的观点。Map已经按键排序了,所以你不能直接在它上面堆。为了解决类似的问题,我创建了一对向量,map值作为第一元素,键作为第二元素,然后堆。它不需要任何压缩器参数。
示例:对于map "map m",使用下面的代码创建vector,然后创建heap。
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());
这将工作,顶部元素将在任何时间点返回。
相关文章:
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- C++ 向量与用户定义的类比较?(==, <, >)
- set_intersection使用自定义设置比较器
- C++ <algorithm> 使用对象作为比较定义的 sort()
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 用户定义的结构是否有默认C++比较器?
- 使用迭代器的自定义比较器函数
- 标准::p riority_queue 的自定义比较器背后的逻辑
- Cython中带有自定义比较器的优先级队列
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 定义具有非标准签名的自定义映射比较器
- 为什么在类或结构中传递自定义比较器函数?
- 如何定义集合数组的比较函数?