web-dev-qa-db-ja.com

C ++でソートされたコレクションはありますか?

Smalltalkでは、sortedCollectionを作成できます。つまり、要素を追加すると、要素が正しい場所に挿入されます。

C++でこのようなものはありますか?または、もっと良いのは、sortedQueueのようなもので、要素を追加すると、最初の要素をポップするだけの構造のようなキューに要素をソートするようなものですか?

セットを調べたところ、これはソートの観点から必要なことですが、順序付けされていないコレクションです。可能な限り短い実行時間を探しています。

19
Jim

_std::priority_queue_ヘッダーファイルにある _<queue>_ を探しているようです。 Push()を使用すると、要素を優先度キューに挿入できます。 top()を使用すると、キュー内の現在最大の要素(または_operator<_の実装方法によっては最小要素)が取得されます。 pop()を使用すると、最大/最小の要素が削除されます。

私の知る限り、ヒープで実装されているため、プッシュとポップの各操作の時間が複雑になりますO(lg n)O(1)で一番上の要素を見るだけです。

20

C++標準ライブラリには、4つの並べ替えられたコンテナがあります。

std::set -一意の値のソートされたシーケンス。
std::map -一意のキー/値ペアのソートされたシーケンス。
std::multiset -値のソートされたシーケンス(可能な繰り返し)。
std::multimap -並べ替えられたキーと値のペアのシーケンス(可能な繰り返し)。

ソートされたキューが必要な場合、探しているのは std::priority_queue であり、これはコンテナアダプタスタンドアロンのコンテナではありません。

#include <queue>

int main()
{
    std::priority_queue<int> q;
    q.Push(2);
    q.Push(3);
    q.Push(1);
    assert(q.top() == 3); q.pop();
    assert(q.top() == 2); q.pop();
    assert(q.top() == 1); q.pop();
    return 0;
}

独自の型をpriority_queueに格納する場合は、クラスにoperator<を定義する必要があります。

class Person
{
public:
    Person(int age) : m_age(age) {}

    bool operator<(const Person& other) const
    {
        return m_age < other.m_age;
    }

private:
    int m_age;
};

Personsのpriority_queueを作成すると、最も古い人が前に並んだキューができます。

53
Peter Alexander

STLコンテナー選択フローチャート( this 質問から):

51
Igor Oks

std :: map ソートされたコンテナ用

std :: queue キュー用。

std :: priority_queue ソートされたキューの場合

7
littleadv

std::setは順序付けられたコレクションです。それを反復すると、要素が順番に表示されます(<演算子またはカスタム述語)。最初の要素の検索と削除はO(1)です。

または、std::priority_queue、これは基本的にヒープであり、効率的な挿入と最小のアイテム削除を可能にします。

実際、順序付けされていない(ハッシュされた)コンテナを見つけるのは困難です。非標準の形式で広く入手可能でしたが、元の標準の一部ではありませんでした。

もちろん、項目の数がそれほど多くない場合は、理論的には遅くても、ソートされたベクトルに項目を保持するだけの方が速いことがあります。

2
Alan Stokes