2009-08-30 4 views
1

はよく私はおそらくめちゃめちゃ愚かな問題を抱えているが、それを理解し、私は私の正気を失うことを約メートルことができませんでした誰かがC++のベクトルの問題

いくつかの行列計算のためのOpenCVを使用して
vector<CvMat*> sample; 
for(int x = 0; x < 29; x += 2) 
{ 
    for(int b = 0; b < 22; b += 2) 
    { 
     cvmSet(g, 0, b, cvmGet(NormalVector, 0, x + b)); 
     cvmSet(g, 0, b + 1, cvmGet(NormalVector, 0, x + b + 1)); 
    } 
    sample.push_back(g); 
} 

まあイムは何をbasiacllay役立つことを願って私は、大きな行列からいくつかの小さな行列を作成し、 "sample"というベクトルに入れます。最初のループはカウンタベースのもので、2番目のループの後に小さな行列を作成するための2番目のループですベクトルに

しかし、問題は、これらのループの後に私はいずれかの行列に到達しようとするときです私はいつもベクトルに最後に入れられたものを得る。 これらのメソッドを使用してベクトル要素にアクセスします。
sample [0];
sample.at(6);
これらの2つについては、最後にベクトルに追加された同じ行列が得られます。間違っていることは何ですか?

答えて

4

あなたsampleベクトルがポインタのリストであるので、あなたはあなたがベクトルに追加する各要素についてCvMatの新しいインスタンスを作成することを確認する必要があります。それ以外の場合は、すべての要素が同じもの(g)を指しているように見えます。

CvMatは、コピーコンストラクタを持っている場合は、あなたがこれを行うことによってそれを修正することができる場合があります

vector <CvMat> sample; 
for(int x =0 ; x<29; x+=2) { 
    // ... 
    sample.push_back(*g); 
} 

これはCvMatオブジェクトのベクトルを作成し、push_back(*g)は、行列のコピーを作成し、プッシュそれはベクトルの後ろにあります。

+0

thx私はそれを今得ました – Emre

0
vector < CvMat*> sample; 

はCvMatのへのポインタのベクトルであり、あなたは継続的にそれに「g」を推進しています。 CvMatの新しいインスタンスを作成し、それらをベクトルに追加し、毎回 'g'を追加する必要はありません。

+0

ああ、私はそれを持っています。どのように私はそれを逃しましたか?あなたに感謝します – Emre