2016-03-31 38 views
0

構造体を作成して2つのベクトルにプッシュします。これらの構造を作成する際にlower_bound関数を使用してソートします。最初の構造は名前でソートされ、2番目の構造はIDでソートされます。機能がどのように見える構造体のアドレスを他の構造体のポインタに代入する

:どのように私はお互いを指すように、これら二つの構造 内のポインタを設定することができます。

bool AddAndSort (name , ID) 
{ 
    auto it = lower_bound (arr_1 . begin(), arr_1 . end(), name, compare2()); 
    auto it1 = lower_bound(arr_2 . begin(), arr_2 .end(), ID , compare1 ()); 

struct1 tmp1(name); // create temporary structures which i will push to the vector 
struct2 tmp(ID); 

arr_1 . insert (it, tmp); 
arr_2 . insert (it1, tmp1); 

/*tmp . p = &tmp1; 
    tmp1 . p = &tmp;*/ 

return true; 

} 

ここで疑問がありますか?

tmp . p = &tmp1; 
tmp1 . p = &tmp; 

しかし、これは動作しません:

は、私はこれを試してみました。

構造:

struct struct1 
{ 
    struct1 (string name) : name (name) { } 
    string name 
    struct2 *p; 
}; 

struct struct2 
{ 
    struct2 (int ID) : ID (ID) { } 
    int ID; 
    struct1 *p; 
} 

ベクトル:

vector<struct1> arr_1 
vector<struct2> arr_2 
+0

なぜ機能しないのですか?コンパイラエラーが出ますか? 'index'は構造体に存在しません。' p'を意味しましたか? – TartanLlama

+0

申し訳ありませんが、私はそれがpする必要があります名前を編集するのを忘れました – kvway

+0

さて、あなたはまだあなたのコンパイラエラーを投稿する必要があります。また、 'std :: lower_bound'は何もソートせず、関数のシグネチャはコンパイルされません。 – TartanLlama

答えて

4

おそらくたい:

auto inserted_it1 = arr_1.insert(it, tmp); 
auto inserted_it2 = arr_2.insert(it1, tmp1); 

inserted_it1->p = &*inserted_it2; 
inserted_it2->p = &*inserted_it1; 

が、以前の参照がinsertによって無効にされています。

+0

最初に意味するものは何ですか? – kvway

+0

@kvway: 'first'は' std :: map'/'std :: set'に挿入するためのものです。 'std :: vector :: insert'として削除されたものはイテレータを直接返します。 – Jarod42

+0

それはクラスメソッド内で動作しますが、他の構造体から要素を出力する別のmetodを宣言すると、seg fault 'for(auto const&tmp:arr_2)が返ってきます<< tmp . p ->名前<< endl; – kvway

0

第1構造体は、名前でソートされ、第2の構造は、ID

によってソートされboost::multi_indexをチェックアウト - それは1つだけの構造で(複数のソートインデックスを有する)は、正確にそれを行うことができます。

指摘したように、構造体間でポインタを保持すると、エラーが発生しやすくなります(挿入時や削除時にアドレスが変化します)。 boost::multi_indexは自動的にボンネットの下でそれを処理します。

関連する問題