我在here中读到 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
我可以从上面的输出中看到调用了无参构造函数。
我的问题是:有没有办法调用map的Value(s)的单参数构造函数?
谢谢
答案 0 :(得分:6)
我可以知道在哪里可以找到这项索赔的参考资料吗?
这就是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())
插入 地图。
关于第二个问题:
有没有办法调用map的Value(s)的单参数构造函数?
您可以在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);
答案 1 :(得分:4)
您可以在cppreference.com找到std::map<…>::operator[]
的有用说明。
我假设您希望有条件地使用非默认构造函数添加值,即,当地图中不存在相应的键时。
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);
auto i = myMap.find(j);
if (i == myMap.end())
i = myMap.emplace(j, 123).first;
i->add(k);
在这两种情况下,新插入的Value
将具有some_member == 123。