2011-08-04 12 views
4

のすべてのメンバーを反復Iは、以下のように定義された2つのstruct S有する:ベクター

struct vertex 
{ 
    double x; 
    double y; 
    double z; 
}; 

struct finalVertex 
{ 
    int n; 
    vertex v; 
}; 

Iリストを反復処理し、すべてのメンバーを印刷するために、次のコードを使用:

vector<finalVertex> finalVertices; 
    vector<finalVertex>::iterator ve; 

    for (ve = finalVertices.begin(); ve < finalVertices.end(); ve++) 
    { 
     out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl; 
    } 
を構文的にCORは何

main.cpp:651: error: 'class __gnu_cxx::__normal_iterator > >' has no member named 'v'

私は、エラーの次のコードを受け取りますセットの要素にアクセスする正しい方法?あなたは何をすべき

答えて

8

問題は演算子の優先順位です:(*ve).v.xまたはより簡単な、ve->v.xを書きます。

std::ostream& operator <<(std::ostream& out, vertex const& value) { 
    return out << value.x << " " << value.y << " " << value.z; 
} 

し、このようにそれを使用します:

とは別に、私はあなたのコードは非常に読みやすくするために、あなたのvertex構造のためoperator <<を上書きすることができ助言する

for (ve = finalVertices.begin(); ve != finalVertices.end(); ve++) 
    out << ve->v << endl; 
+0

+1、私はこれを追加しようとしていたが、私は遅すぎた:) – Gob00st

3

は次のとおりです。

(*ve).v.x 

が、それは吸う:

ve->v.x 

何もできることはあります。 :)

+0

ありがとう!コンパイル! :D –

2
out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl; 

*(ve).v.x*((ve).v.x)に相当します。あなたはおそらくしたい:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl; 

または:

out << ve->v.x << ve->v.y << ve->v.z << endl; 

はまた、あなたのループはそれができるほど効率的ではありません。すべての反復が必要とされていないend()を呼び出して、あなたが事前にインクリメントを使用してに慣れる必要がありますので、可能な場合はポストインクリメントは、無地のポインタ/整数よりもイテレータとたくさん重くなります

for (ve = finalVertices.begin(), end = finalVertices.end(); ve != end; ++ve) 
+0

ありがとう! –

+0

さて、end()は最適化されたビルドでインライン化されているので、典型的なコンテナを使った計算は含まれていないはずです... – ypnos

+0

@ypnos:おそらく、はい。そこには多くの非定型コンテナがあります。 –

2
が内側にあなたの間接参照を移動

そのような括弧は、:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl; 

私もve != finalVertices.end();ve < finalVertices.end();を変更することをお勧めしたいです。

2
 for (ve = finalVertices.begin(); ve != finalVertices.end(); ++ve) 
     { 
      ve->v.x; 
     } 
1

あなたが書くべきではありません VEは< finalVertices.end() あなたが書かなければならない がまし!= finalVertices.end()