2016-10-05 3 views
0

これは、ベクトルの特定のインデックスにクラスのインスタンスを追加することです。このインデックスは、最初は存在しないか、またはクリアされ、そのクラスのインスタンスがその位置に書き込まれている既存のインデックスである可能性があります。ベクトルで新しいコンテンツを割り当てるためのポインタで悩む

以下は、これらのインスタンスをベクターに書き込んだり書き込んだりするために使用していた関数で、下にコメントしていますが、他の2つのメソッドを使用することができます。push_backは、最後のベクトル。

私は、割り当てが既存の要素にのみデータを追加できると感じていますか?そしてその挿入は、新しい要素を追加し、上書きするのではなく既存の要素を下にシフトさせることがあります。 C++のチュートリアルが私を混乱させ始めているので、ちょっと分かりやすくしてください。

また、そのデータを変更することができるように、Personベクトル(この場合は「allthePeople」と呼ばれます)を参照/参照解除/呼び出しする正しい方法はありますか?ベクトルの位置は0から始まり、そして私は単に1ではなく0

で自分のID番号を開始したかったので、また単に、「場所」を明確にする

void createnewPerson(int assignID, RECT startingpoint, vector<Person>* allthePeople, int framenumber) { 
    Person newguy(assignID, startingpoint, framenumber); 

    std::cout << "New Person ID number: " << newguy.getIDnumber() << std::endl; 
    std::cout << "New Person Recent Frame: " << newguy.getlastframeseen() << std::endl; 
    std::cout << "New Person Recent history bottom: " << newguy.getrecenthistory().bottom << std::endl; 
    int place = assignID - 1; 

    //This is where I am confused about referencing/dereferencing 
    allthePeople->assign(allthePeople->begin() + place, newguy); 
    //allthePeople->insert(place, newguy); 
    //allthePeople->push_back(newguy); 
} 

は、常に「assignID」よりも1小さいです------------- EDIT:問題を解決して追加した場合はLOOP -----------------

void createnewPerson(int assignID, RECT startingpoint, vector<Person>* allthePeople, int framenumber) { 
    Person newguy(assignID, startingpoint, framenumber); 

    std::cout << "New Person ID number: " << newguy.getIDnumber() << std::endl; 
    std::cout << "New Person Recent Frame: " << newguy.getlastframeseen() << std::endl; 
    std::cout << "New Person Recent history bottom: " << newguy.getrecenthistory().bottom << std::endl; 
    int place = assignID - 1; 

    if (allthePeople->size() > place) 
    { 
     //assuming places starts from 1 to vector's size. 
     (*allthePeople)[place] = newguy; 
    } 
    else 
    { 
     allthePeople->push_back(newguy); 
    } 
} 
+0

'allthePeople'はベクトルへのポインタなので、' allthePeople - > ... 'を使って操作します(つまり、アンパサンドをスキップします)。その人をベクターの特定の場所に置く理由は何ですか? – pingul

+0

これは、人が一度スクリーンを離れてもはや重要でなくなると、そのデータをクリアするからです。そして、毎回ベクトルの最後に新しい人物を追加するのではなく(非常に大きなベクトルで終わり、不必要なものがたくさん保存される)、新しい人を最初の利用可能な位置に追加したいが保存されています。 –

+0

IDがランダムな場合、 'vector'の代わりに' map'を使ってオブジェクトを保存することができます。 –

答えて

1

assignに意味されますをベクターの完全な内容に置き換えてください。

すべての人を特定の場所に配置したいと仮定します。次に、演算子[]を使用して、代入を使用するのではなく、必要な場所に値を配置することをお勧めします。あなたは適切なサイズのベクトルを持つ必要があります。

if (allthePeople->size() >= place) 
{ 
    //assuming places starts from 1 to vector's size. 
    (*allthePeople)[place - 1] = newguy;  
} 
+0

ありがとうございました。私はあなたのコードにわずかに変更して質問への私の最終的な答えを加えました、そして、新しい要素のためのスペースがなければ呼び出される "else"の包含 –

関連する問題