2012-05-13 2 views
0
int main() 
{ 
    list<char> letters; 
    priority_queue<char, vector<char>, less<char>>letters_trans; 

    cout << "Enter some sentence: " << endl << endl; 

    std::istream_iterator<char> input(cin), input_end; 

    copy(input, input_end, back_inserter<list<char>>(letters)); 

    for each(char letter in letters) 
    { 
     letters_trans.push(letter); 
    } 

    while(!letters_trans.empty()) 
    { 
     cout << letters_trans.top(); 
     letters_trans.pop(); 
    } 
    cout << endl; 
    getch(); 
    return 0; 
} 

Итератор приоритета и потока ввода

Итак, вы можете видеть, что у меня есть школьный проект для переноса cin в очередь приоритетов. Ну, я «сделал это» ... Что я сделал, это ввести istream_iterator, чтобы перечислить

, а затем в priority_queue, что очень неэффективно. Думаю, в долгосрочной перспективе. Так есть способ перенести напрямую cin на priority_queue без среднего человека .. Я пытался делать это, но функция копирования обыкновение позвольте мне иметь priority_queue как arguement

ответ

1

В C++ 11, это должно работать:

std::priority_queue<char> q(std::istream_iterator<char>(std::cin), std::istream_iterator<char>()); 

Полный пример:

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <queue> 

int main() 
{ 
    std::priority_queue<char> q(std::istream_iterator<char>(std::cin), std::istream_iterator<char>()); 

    while (!q.empty()) 
    { 
     std::cout << q.top() << '\n'; 
     q.pop(); 
    } 
} 
+1

Почему промежуточный вектор? Очередь приоритетов может быть построена непосредственно из пары входных итераторов. –

+0

@AlanStokes: Действительно, я пропустил этот конструктор. Исправлено, спасибо! –

3

Вы может const ruct priority_queue (или любой std-контейнер) из пары итераторов [first, last). От cpp reference:

template <class InputIterator> 
     priority_queue (InputIterator first, InputIterator last, 
          const Compare& x = Compare(), 
          const Container& y = Container()); 

первого, последнего

Входных итераторов в начальные и конечные позиции в последовательности. Используемый диапазон - это [первый, последний), который включает в себя все элементы между первым и последним, включая элемент, отмеченный , но не элемент, указанный последним. Тип шаблона функции может быть итератором ввода любого типа.

Код:

#include <iostream> 
#include <iterator> 
#include <queue> 
#include <vector> 

int main() 
{ 
    std::istream_iterator<char, std::vector<char> > input(std::cin), input_end; 
    std::priority_queue<char> q(input, input_end); 

    while (!q.empty()) 
    { 
    std::cout << q.top() << std::endl; 
    q.pop(); 
    } 
} 
+0

Это использует конструктор, который принимает два InputIterators - input и input_end не являются указателями. –

+0

@AlanStokes Спасибо. Modified. Подпись конструктора была скопирована с [sgi] (http://www.sgi.com/tech/stl/priority_queue.html). – Vikas