2

以下のコードでは、d1 の 3 つのオブジェクトがあり、d2 は push_back() を実行するために作成されます。1 つは作成したとき、1 つは v.push_back() を呼び出したとき、もう 1 つは実際にベクターにコピーされたときです。

C++03 で std::vector を使用せずにこれを回避するための最良の代替手段は何ですか?

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct Details
{
    string fname;
    string lname;
    string address;
    int age;
};

int main(int argc, char **argv)
{
    vector<Details> v;

    Details d1;
    d1.fname = "vivek";
    d1.lname = "kumar";
    d1.address = "New Delhi";
    d1.age = 25;

    v.push_back(d1);

    Details d2;
    d2.fname = "some name";
    d2.lname = "some lastname";
    d2.address = "some address";
    d2.age = 25;

    v.push_back(d2);

    return 0;
}
4

2 に答える 2

6

const 参照が渡されるため、呼び出しstd::vector::push_back()自体はコピーを作成しません。ベクター要素となるコピーを作成するだけです。そして、このコピーは のセマンティクスによって必要とされstd::vectorます。

コピーが比較的安価なときに、次push_back()のこともできます。Details

Details d1; // Now the 3 strings of d1 are still small
v.push_back(d1); // essentially copies 3 empty strings and an int.
v.back().fname = "vivek";
v.back().lname = "kumar";
v.back().address = "New Delhi";
v.back().age = 25;
于 2013-03-14T14:19:30.407 に答える
1

ここでパフォーマンスが最も重要であると本当に判断した場合は、参照セマンティクスが必要/実装されます。

  • C++11 ではムーブ セマンティクスがあるため、Details 構造体のムーブ コンストラクターを実装するので、通常はそれを使用することを強くお勧めします。
  • C++03 を使用しているため、boost::shared_ptr を使用して、次のように Details 構造体をラップできますvector<boost::shared_ptr<Details> >。C++03 を使用しているため、間のスペース文字に注意してください>
  • 通常は、shared_ptr の代わりに unique_ptr をお勧めしますが、unique_ptr は C++11 でのみ使用できます。C++11 では、移動セマンティクスの代替手段がほとんどの場合優れています。
  • 生のポインターをお勧めしない理由は、生のポインターのメモリを手動で管理する必要があるためです。

あなたの例については、C++03 では push_back が const 参照を取るため、構造体のコピーが 1 つしかないことに注意してください。上で提案した方法のいずれかを使用しても 1 つのコピーが実行されますが、コピーのサイズはチェックされ、構造のサイズに合わせてスケーリングされません。データ。

于 2013-03-14T14:34:21.843 に答える