以下代码:
std::list<int> list;
std::make_heap(list.begin(), list.end());
导致一大堆错误,包括:
错误:不匹配'operator - '
当我将list
声明为std::vector
时,我没有收到这些错误,为什么?
答案 0 :(得分:2)
作为函数std::make_heap
的第一个和第二个参数传递的两个迭代器必须是RandomAccessIterator
s。列表迭代器不是RandomAccessIterator
而std::vector
和std::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所示。