2015-03-15 2 views
1

Следующий код:Посылка куча со списком вызывает ошибки

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

Live demo

вызывает целую кучу ошибок, в том числе:

error: no match for 'operator-'

Когда я объявляю list, как std::vector, я не получайте эти ошибки, почему?

+2

Почему вы не включаете сообщения об ошибках? –

+0

Я редактировал вопрос, чтобы включить [SSCCE] (http://sscce.org/), живую демонстрацию и пример ошибки. Если вы чувствуете, что это редактирование неправильно отражает вашу проблему, не стесняйтесь отката. – Shoe

ответ

2

Два итератора переданы как первый и второй аргументы функции std::make_heap должен быть RandomAccessIterator s. Итераторами списка не являются RandomAccessIterator s, а std::vector и std::array.

В стандарте это указано в интерфейсе для make_heap в §25.1:

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 имеем:

If an algorithm’s template parameter is named RandomAccessIterator, RandomAccessIterator1, or RandomAccessIterator2, the template argument shall satisfy the requirements of a random-access iterator

И, наконец, итераторы произвольного доступа являются описано в §24.2.7:

A class or pointer type X satisfies the requirements of a random access iterator if, in addition to satisfying the requirements for bidirectional iterators, the following expressions are valid as shown in Table 111.

table for the requirements of random access iterators

+0

Спасибо за очень проницательный ответ! – Bob

Смежные вопросы