2011-10-24 5 views
0

QSet [QTime](またはこれに類似した)データを格納する必要があります。私がしたいことは、AおよびBは、[INT] 5 7 9 11 13 範囲(6、11)=> 7 9 11存在しない要素によって制限されるQSetのサブセットの取得

すなわち

ベクトルが存在しない可能性の範囲内の要素のサブセットを取得することです

可能ですか?たぶん、それをする良い方法がありますか? アドバイスありがとうございました

答えて

1

明らかな解決策はstd::set<QTime>です。それは注文され、lower_boundupper_boundメソッドを提供しています。これらは実際の境界がセットに存在することを必要としません。

+0

+1新規の事実...私は、全体的なQtベースのプロジェクトのQtコレクションクラスは、標準ライブラリに対していくつかの異なる機能を提供していることに言及します。私のコードベースに最も関連性のあるものの1つは、スレッドセーフな暗黙的な共有です。http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html – HostileFork

+0

暗黙の共有は、マルチスレッドアプリケーションでは負担になることが証明されています。単一の競合したコピーよりも複数の独立したコピーを持つ方がよいでしょう。メモリは安く、同期はできません。 – MSalters

0

QSetは「順序付けられていない」コレクションであり、あなたが求めていることを行うための効率的な操作は特にありません。あなたはかなりそれらを列挙し、それが修飾するかどうかを確認するために、各要素をテストする必要があります。

QSet<QTime> set; 
QTime earliest = QTime::fromString("1.30", "m.s"); 
QTime latest = QTime::fromString("10.30", "m.s"); 
... 
QSet<QTime> subset; 
QSetIterator<QTime> i (set); 
while (i.hasNext()) { 
    QTime t = i.next(); 
    if ((t >= earliest) && (t <= latest)) { 
     subset.insert(t); 
    } 
} 

それがあなたの目的のために十分に速くない場合は、異なるデータ構造および技術を使用する必要があります。あなたのサブセットをソートするには、それを順序付けされたコレクションに格納する必要がありますが、実際にはそれを「サブセット」と呼びませんが、「サブレンジ」や「スライス」のようなものです。 (単語は、通常、コンピュータサイエンスに「設定」の要素の順序は、アプリケーションのために興味深いものではありませんことを意味...しかし@MSaltersはstd::setは私にニュースをしたために、持っていないことを指摘している!)

+0

コンピュータサイエンスの単語 "set"は、明示的に( 'std :: unordered_set'に反対する)C++の' std :: set'とは無関係です。 – MSalters

+0

std :: setには順序がありますか?私が今までに見たことのある「セット」はすべてオーダーを保証しませんでした。 STLは私がこれに気付くのに十分使用したものではありません...私は彼らに "ordered_set"と "set"と呼ぶと思っていました。これを指摘してくれてありがとう、私は彼らの推論を調べます。 – HostileFork

+0

はい、テンプレートパラメータでもあります: 'template > class set'です。私。デフォルトは昇順ですが、 'set >'は降順です。 – MSalters

関連する問題