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

4

2 回答 2

4

您可以从一对 iterator 构造priority_queue(或任何标准容器)[first, last)。来自cpp 参考

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

第一,最后

将迭代器输入到序列中的初始位置和最终位置。使用的范围是[first,last),它包括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();
  }
}
于 2012-05-13T19:07:31.737 回答
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();
    }
}
于 2012-05-13T18:48:36.933 回答