2015-01-14 22 views
5

これらのプロパティを持つC++世界のコンテナはありますか?std :: vectorとstd :: setプロパティを持つコンテナ?

  • 要素がユニークで、カスタマイズ可能なコンパレータ
  • の助けを借りて注文したランダムアクセス演算子を提供します。

私は現在、注文したコレクションへのランダムアクセスを持つことができるようにstd::copy(_set.begin(),_set.end(),std::back_inserter(_vec))を行い、その後std::set<C,COMPARATOR>に自分のデータを収集しています。しかし、サイズは数億になるかもしれません。

+0

うヒープのヘルプ?合計発注はしませんが、最大要素を選択することができます。 – Quentin

+0

@Quentin厳密な注文は不可欠です – Oncaphillis

+2

データの途中でたくさんの挿入や削除をしていますか?それは容認できる解決策に大きな違いを生み出すでしょう。あなたの現在のソリューションは、ベクトルに直接追加して 'std :: sort'を実行すると、全体的にわずかに速くなるはずです。 –

答えて

7

ブーストがオプションの場合は、flat_set in the Containers libraryをご覧ください。

flat_setためのインタフェースはstd::setのものと同じであるが、それはstd::vectorのように、ランダムアクセスイテレータを提供します。

#include <boost/container/flat_set.hpp> 

[...] 

boost::container::flat_set<int> c; 
c.insert(1); 
c.insert(2); 
c.insert(3); 
c.insert(4); 

// unfortunately, no operator[] on the container itself, 
// but the iterator is random access 
int third_element = c.begin()[2]; 

あなたが標準ライブラリで立ち往生している場合は、この目的のためにソートvectorを使用することができます。標準ライブラリーは実際に<algorithm>ヘッダーに多くのアルゴリズムを提供しています。このアルゴリズムを使用すると、ソートされたイテレーターの範囲でsetを使用してできることはほとんどできます。

+0

私は挿入/削除のパフォーマンスを見なければならないでしょうが、これはそれだと思います。 boostは間違いなくオプションです – Oncaphillis

+1

これらはランダムアクセス・イテレータを提供しますが、 'operator []'はありません。その理由は何か不思議です。 – Barry

+1

さて、私は10^6の乱数の挿入でテストを実行し、それはsthを取った。 140秒のように。 stdへの挿入:: を後でstd :: vector にコピーして1秒未満でコピーしました。私は初期化後に多くの挿入/削除を行っていないので、私は私の解決策に固執すると思います。しかし、私はまだ私の最初の質問に適切な解決策としてこの答えを取る。 – Oncaphillis

1

私が知っていることはありません。しかし、何億もの要素といくつかの順序付けられたアクセスによって、メモリ表現がコンパクトで連続的であることが望まれるかもしれません。これは、コンテナクラスのためのさらに多くの要件です。

私はstd::vectorに行き、あなたが説明したアプローチまたは他のソートアルゴリズムを使用します。後であなたのstd::setは必要ないので、メモリを解放することができます。

1

標準のC++ライブラリにはありません。ご注文の場合はset/priority_queue、ランダムアクセスの場合はvector/dequeとなります。

しかし、単に注文を強制するvectorの周りに独自のラッパーを書くことを止めるものは何もありません。それほど多くのコードではありません。いくつかの例機能:

template <typename T, typename COMP = std::less<T>> 
class sorted_vec { 
    std::vector<T> vec_; 

public: 
    // random access 
    using iterator = typename std::vector<T>::iterator; 
    T& operator[](size_t idx) { return vec_[idx]; } 

    iterator begin() { return vec_.begin(); } 
    iterator end() { return vec_.end(); } 

    // insertion 
    void push(const T& val) { 
     vec_.insert(std::lower_bound(vec_.begin(), vec_.end(), COMP{}), 
        val); 
    } 
}; 
+0

私は 'T&operator []'の 'const'バージョンも書いていますので、' const'参照を渡すことができます。 – vsoftco

+0

@vsoftcoこれは決して関数の完全なリストではない(例えば 'const_iterator'などはありません) – Barry

関連する問題