2012-02-03 13 views
1

編集:以下の質問はthisによって回答されました。私は新しい更新された質問がある、それはそれ以上使用すること効率的です:(私の友人は、シーケンシャルメモリを使用しているので、ベクトルのベクトルを置くことは非効率的で、push_back時にreallocは、全体の大きなベクターのためのメモリのチャンクを配置することができます)ベクトル:: push_backとC++のベクトルポインタの値にアクセス

(写真ラインのベクトルであり、ラインがポイントのベクトルである)

std::vector<Point> *LineVec; 
std::vector<Line> PictureVec; 

versus 

std::vector<Point> LineVec; 
std::vector<Line> PictureVec; 


struct Point{ 
    int x; 
    int y; 
} 

私はAのベクトルを取得しようとしています私の友人は、シーケンシャルメモリを使用し、ベクトルのベクトルは膨大な量のスペースを必要とするため、ベクトルのベクトルを置くことは効率が悪いと私に言った。だから彼が提案したのは、ポインタベクトルのベクトルを使うことでした。したがって、内側のベクトルは次のようになります。明らかに私はC++には非常に新しいので、どんな洞察にも感謝します。

struct Shape{ 
    int c; 
    int d; 
} 
std::vector<Shape> *intvec; 

私はこれをどのようにしてやりますか?このようなもの?

Shape s; 
s.c=1; 
s.d=1; 
intvec->push_back(s); 

はまた、私は、しかし、私が上記のコードは動作しないと思う理由それゆえ、動作するようには思えない、通過するイテレータを書きました。最後に私の最後の懸念は、上記のコードが動作する間、私の出力のために本当に奇妙な値を与えることです。 7桁の長さであり、私は、SCのために入れて、ベクター自体の上にベクトルへのポインタを使用する方が効率的であるかどうかについてのあなたの更新の質問に関しては

for(std::vector<Shape>::iterator it=Shapes->begin();it<Shapes->end();it++){ 
    Shape s = (*it); 
    std::cout << s.c << s.d << std::endl; 
} 
+7

あなたの友人は間違っています。'vector'オブジェクト自体は、連続した配列へのポインタ (いくつかの追加のメンバと共に)です。そのため、間接的なレベルのインダイレクションを導入し、さらにスペースを無駄にしています。 –

+0

正確には動作しません。コンパイラエラー?ランタイムエラー?あなたはintvecポインタをどこでもintalizeしますか?(新しいstd :: vector ())? – Fox32

+0

@larsmansベクターオブジェクト自体はポインタではありませんが、内部的にバッファへのポインタが含まれていますが、それでも知っていますが、それでもなおxDを流したかったのです –

答えて

1

ベクトルへのポインタのベクトルを使用すると、ではなく、のベクトルのベクトルより効率的です。余計なレベルのインダイレクションが導入されるため、効率が悪いです。 ではなく、は結果として得られる2次元配列のすべての要素を連続的に割り当てます。

理由は、ベクターは、配列へのポインタがvector<T>

template <typename T> 
class vector 
{ 
    T *p; // pointer to array of elements 
    size_t nelems, capacity; 

    public: 
    // interface 
}; 

とほぼ実現されるという意味で、実質的なことであるので、ベクトルのベクトルは、性能面、ダイナミックように振る舞うこと配列へのポインタの配列。

[注:私はC++標準の章と節を引用することはできませんが、実際に実装する唯一の実用的な方法はstd::vectorの操作と複雑さを制約しています。

0

をSD間違いない値が多数。場合によっては、実際のベクトル自体ではなくベクトルへのポインタを使用する方が効率的です。特定の例では、関数のパラメータとしてベクトルを使用します。

EX:この場合

void somefunction(std::vector<int> hello) 

STDのためのコピーコンストラクタ::ベクトルは、この関数は(ベクターに含まれる要素を含む、完全にそのコピーベクター)と呼ばれているいつでも呼び出されます。参照渡しはこの余分なコピーを取り除きます。

ベクトルへのポインタを使用するときに、push_back自体がより効率的かどうかについては、ポインターを使うのは効率的ではありません(それらはおおよそ同じ時間にすべきです)。

関連する問題