2

すべて、私は次のコードを持っています:

.hファイル内:

struct Foo
{
   int ma;
   double mb;
   Foo(int a, double b)
   {
        ma = a;
        mb = b;
   }
   Foo()
   {
        ma = 0;
        mb = 0.0;
   }
};

class MyClass
{
public:
    MyClass();
private:
     std::map<std::string,Foo> m_map;
};

In .cpp file:

MyClass::MyClass()
{
    m_map["1"] = Foo( 1, 0.1 );
    m_map["2"] = Foo( 2, 0.2 );
    m_map["3"] = Foo( 3, 0.3 );
}

Foo(0、0)をm_map ["2"]に割り当てる最も簡単な方法は何ですか?

簡単に書けます

m_map["2"] = Foo( 0, 0 );

ただし、この場合、タイプFooの新しい変数が作成されます。

また、ループがないため、イテレータを実際に使用することはできません...

ありがとうございました。

4

5 に答える 5

3

あなたは単に書くことができます:

m_map["2"];

これはcppreferenceからの引用ですstd::map::operator[]

キーをキーとして使用し、デフォルトの構築されたマップ値を使用して新しい要素をコンテナに挿入し、新しく構築されたマップ値への参照を返します。

したがって、値を「取得」しようとすると、デフォルトのコンストラクターが呼び出されます。

于 2012-12-25T00:12:43.960 に答える
2

私があなたを正しく理解していれば、あなたはただ書くことができます

m_map["2"].ma = 0;
m_map["2"].mb = 0;

理由はわかりませんが

m_map["2"] = Foo(0,0); //or just Foo() because of the overloaded constructor

問題です。

于 2012-12-25T00:11:46.603 に答える
1

C ++はコピーセマンティクスを使用し、コンテナーはユーザーが入れたもののコピーを保持します。std::vectorまた、ライブラリはコンテナ内のオブジェクトのコピーを自由に作成でき(再割り当てなど)、オブジェクトのコピーはオブジェクトと同等であると想定されていることにも注意してください。

コピーが問題になる場合(パフォーマンスまたはセマンティックのため)、解決策は、間接参照のレベルを追加し、実際のオブジェクト自体ではなく、オブジェクトまたはプロキシへのスマートポインターをマップ内に配置することです。

このように、ライブラリによって作成されたコピーまたは一時的な数は関係ありません。

于 2012-12-25T00:20:07.007 に答える
0

簡単に書けます

m_map["2"] = Foo( 0, 0 );

ただし、この場合、タイプFooの新しい変数が作成されます。

Foo( 0, 0)いいえ、マップの内部ストアにインスタンスのコピーを作成します。

于 2012-12-25T00:08:46.637 に答える
0

の値を変更するメソッドがないので、はい、新しいオブジェクトをFoo割り当てるだけです。map["2"]古いものは上書きされます-とにかく元のオブジェクトのコピーなので、違いはありません。とにかくあなたFoo(0,0)だけが非常に短い時間生きます。

Foo::SetAB(int a, double b) { ma = a; mb = b; }または、関数(または、aとbを設定する2つの関数、または両方をゼロに設定する明確な関数、またはこのテーマの他のバリエーション)を追加することもできます。m_map["2"].SetAB(0, 0); この場合、-を使用します。オプションですが、Foo作成に多くの「労力」を要した複雑なオブジェクト(たとえば、多くのメンバー、多くの値、割り当てるメモリ、格納する文字列など)がある場合は、メンバーvariablsを変更する関数。

于 2012-12-25T00:14:34.490 に答える