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

priority_queueiterator のペアから(または任意の std コンテナ)を構築できます[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 に答える