c++ - 当 C++的键不存在时,初始化 std::map 值

  显示原文与译文双语对照的内容

如果键不存在,那么我在这里读到:std::map 操作符 [] create创建一个对象( 如果键不存在) 。

首先我可以知道在哪里可以找到这个声明的引用( 尽管我知道它是 true )?

下面的代码 Fragment:


#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



从上面的输出可以看到,没有调用参数构造函数。

问题 有任何方法可以调用map的一个参数构造函数?

谢谢你

时间: 原作者:

我可以知道在哪里可以找到这个声明的参考?

这就是C++11标准规定的内容。 每个段落 23.4.4.3:


T& operator[](const key_type& x);



1 效果: 如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入到地图中。

[... ]


T& operator[](key_type&& x);



5 效果: 如果映射中没有与 x 等效的键,则将 value_type(std::move(x), T()) 插入到地图中。

关于第二个问题:

是否可以调用映射值的一个参数构造函数?

你可以在C++03中执行这里操作:


void some_other_add(int j, int k) {


 myMap.insert(std::make_pair(j, Value(k)));


}



并在C++11中使用 emplace() 成员函数:


myMap.emplace(j, k);



原作者:

你将在 cppreference.com 找到关于 std::map<…>::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 。

原作者:
...