Priority_queue和输入流迭代器

时间:2012-05-13 18:45:02

标签: c++ istream-iterator

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作为争论。

2 个答案:

答案 0 :(得分:3)

您可以从迭代器priority_queue对构造[first, last)(或任何std容器)。来自cpp reference

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

第一,最后

     

将迭代器输入到a中的初始位置和最终位置   序列。使用的范围是[first,last),包括所有   first和last之间的元素,包括指向的元素   第一个但不是最后指向的元素。功能模板类型   可以是任何类型的输入迭代器。

代码:

#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();
  }
}

答案 1 :(得分: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();
    }
}