使用列表创建堆会导致错误

时间:2015-03-15 02:37:11

标签: c++ heap containers

以下代码:

std::list<int> list;
std::make_heap(list.begin(), list.end());

Live demo

导致一大堆错误,包括:

  

错误:不匹配'operator - '

当我将list声明为std::vector时,我没有收到这些错误,为什么?

1 个答案:

答案 0 :(得分:2)

作为函数std::make_heap的第一个和第二个参数传递的两个迭代器必须是RandomAccessIterator s。列表迭代器不是RandomAccessIteratorstd::vectorstd::array是。

在标准中,这是在§25.1的make_heap界面中指定的:

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

并在§25.1.5.5中我们有:

  

如果算法的模板参数名为RandomAccessIterator,RandomAccessIterator1或RandomAccessIterator2,则模板参数应满足随机访问迭代器的要求

最后,随机访问迭代器在第24.2.7节中描述:

  

类或指针类型X满足随机访问迭代器的要求,除了满足双向迭代器的要求外,以下表达式有效,如表111所示。

table for the requirements of random access iterators