4

キーが存在しない場合、 std::map operator[] がオブジェクトを作成することをここで読みました!

まず、この主張の参考文献がどこにあるのか教えていただけますか? (それが真実であることはわかっていますが)

次に、次のコード スニペットを想像してください。

#include <iostream>
#include <vector>
#include<map>

class Value {
//..
    int some_member; //is used for any purpose that you like
    std::vector<int> some_container;
public:
    Value(int some_member_) :
            some_member(some_member_) {
        std::cout << "Hello from the one-argument constructor" << std::endl;
    }
    Value() {
        std::cout << "Hello from the no argument constructor" << std::endl;
    }
    void add(int v) {
        some_container.push_back(v);
    }
    int getContainerSize()
    {
        return some_container.size();
    }

//...
};

//and somewhere in the code:

class A {
public:
    std::map<int, Value> myMap;

    void some_other_add(int j, int k) {
        myMap[j].add(k);
    }
    int getsize(int j)
    {
        return myMap[j].getContainerSize();
    }

};
//and the program actually works
int main() {
    A a;
    std::cout << "Size of container in key 2 = " << a.getsize(2) << std::endl;
    a.some_other_add(2, 300);
    std::cout << "New Size of container in key 2 = " << a.getsize(2) << std::endl;

    return 1;
}

出力:

Hello from the no argument constructor
Size of container in key 2 = 0
New Size of container in key 2 = 1

上記の出力から、引数のないコンストラクターが呼び出されていることがわかります。

私の質問は:マップの Value(s) の引数が 1 つのコンストラクターを呼び出す方法はありますか?

ありがとうございました

4

2 に答える 2

4

cppreference.comstd::map<…&gt;::operator[]での役立つ説明を見つけることができます。

デフォルト以外のコンストラクターを使用して条件付きで値を追加したい、つまり、対応するキーがマップに存在しない場合を想定しています。

C++03

std::map<int, Value>::iterator i = myMap.find(j);
if (i == myMap.end())
    i = myMap.insert(std::map<int, Value>::value_type(j, 123)).first;
i->add(k);

C++11

auto i = myMap.find(j);
if (i == myMap.end())
    i = myMap.emplace(j, 123).first;
i->add(k);

どちらの場合も、新しく挿入されValueた は some_member == 123 になります。

于 2013-05-05T09:13:35.460 に答える