2012-05-05 8 views
1

私はアプリケーションのboostとstandardからunordered_setを使用しようとしていますが、目的は場所、つまりこのセットの特定の要素のインデックスを見つけることです。結果には微妙な違いがあります。ブースト中の要素はこの簡単なプログラムに従って逆転されます。問題はどこだ?boostと標準のunordered_setの相違

シンプル 'のwhat-if' コード:ブースト

#include <iostream> 
#include <iterator> 
#include <unordered_set> 
#include <boost/unordered_set.hpp> 

//using boost::unordered_set; 
using std::unordered_set; 
using std::distance; 

int main() 
{ 
    unordered_set<int> Set; 
    int sz = 10; 
    for(int k=0;k<sz;k++) 
     Set.insert(k); 
    unordered_set<int>::iterator ind_searched = Set.find(8); 
    unordered_set<int>::size_type indx = distance(Set.begin(), 
               ind_searched); 
    std::cout << " Index of element is " 
      << indx << std::endl; 
    return 0; 
} 

私は

Index of element is 1 

を取得し、標準unordered_setと私は

との両方をコンパイル

Index of element is 8 

を取得しています

g++ sgi_stl_1.cc -I /home/utab/external_libraries/boost_1_48_0/ -std=c++0x 
+2

接頭辞 'unordered'は実際には理由のために存在します。それらのコンテナの順序は定義されておらず、あなたはそれに依存するべきではありません。 – pmr

答えて

6

あなたは、unordered_set、そのmulti対応または同等もしくはhash_setまたはhash_mapsunordered_mapのいずれかの実装内部の順序については何も仮定するべきではありません。要素が定義された完全な実装として格納され、時間の変化が起こりやすい場所を考えてみましょう。オーダーは、boostC++11標準の間で異なるだけでなく、異なるハードウェアプラットフォーム間および異なるC++実装間で変化する。特定の順序に依存するコードには欠陥があります。だから、あなたの質問にお答えします

どこが問題なのですか?

この問題は、順序付けられていないデータ構造内のデータの順序を仮定している場合のみです。

+0

私の考えは、挿入された要素が挿入された順番で格納されているので、マップを作成してから検索キーを押しながら要素とインデックスにstd :: map を使用することをお勧めします値を指標として、私はより良い選択肢がないと思いますか? –

+1

@UmutTabak私は分かりません。それは余分な地図を使用して少し複雑に聞こえる。順序を気にする場合は、ベクトルまたはリストを使用します。高速検索と挿入が必要な場合は、unordered_mapを使用します。たぶんあなたは実際に何をしようとしているのか説明できますか? – juanchopanza

+0

もともとの郵便で説明されているように、目的は場所、すなわちこのセット内の特定の要素のインデックスを見つけることです。たとえば、1 7 4 2が要素であり、要素4のインデックスが3なので、これは私がやりたいことですが、元の要素の要素は順序付けされていないので、これらの要素を順序付けする必要はありません。それを使って必要な情報を抽出してください... –

関連する問題