map<string, string> dada;
dada["dummy"] = "papy";
cout << dada["pootoo"];
我很困惑,因为我不知道它是否被认为是未定义的行为,如何知道何时我请求一个不存在的键,我只是使用find来代替?
Answers:
的 map::operator[]
对应于给定键的值的数据结构的搜索,并返回到它的基准。
如果找不到,它将透明地为其创建一个默认的构造元素。(如果您不希望出现这种情况,则可以使用该map::at
函数。)
您可以在此处获得std :: map方法的完整列表:
http://en.cppreference.com/w/cpp/container/map
这是map::operator[]
当前C ++标准的文档...
T& operator[](const key_type& x);
效果:如果在映射中没有等效于x的键,则将value_type(x,T())插入到映射中。
要求:key_type必须为CopyConstructible,而mapd_type必须为DefaultConstructible。
返回:对与* this中的x对应的mapping_type的引用。
复杂度:对数。
T& operator[](key_type&& x);
效果:如果地图中没有等效于x的键,则将value_type(std :: move(x),T())插入地图。
要求:mapped_type必须是DefaultConstructible。
返回:对与* this中的x对应的mapping_type的引用。
复杂度:对数。
ISO/IEC 14882:2011(E)
吗?
如果您尝试访问key value
using索引运算符[]
,则可能会发生两种情况:
key
。因此它将返回对应的key value
。key
。在这种情况下,它将使用将自动key
向地图添加null value
。"pootoo"
键在您的地图中不存在。因此,它会自动添加这key
与value = ""
(空字符串)。并且您的程序将打印空字符串。
这里的地图大小将增加1
。
要搜索关键字,您可以使用map_name.find()
,map_name.end()
如果关键字不存在,它将返回。并且不会key
添加任何额外的内容。
[]
要设置键值时可以使用运算符。
如果运算符[]找不到所提供键的值,则会在该位置插入一个。
但请注意,如果您访问not exist key
并调用其成员函数,例如mapKV [not_exist_key] .member_fun(),则该程序可能会崩溃。
让我举一个例子,测试类如下:
struct MapValue{
int val;
MapValue(int i=0){
cout<<"ctor: "<<i<<endl; val = i;
}
~MapValue(){
cout<<"dtor: "<<val<<endl;
}
friend ostream& operator<<(std::ostream& out, const MapValue& mv){
cout<<"MapValue: "<<mv.val<<endl;
}
string toString(){
cout<<"MapValue: "<<val<<endl;
}
};
测试代码:
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
cout<<"-----cout key[2]-----"<<endl;
cout<<idName[2]<<endl;
cout<<"-----cout key[5]-----"<<endl;
cout<<idName[5]<<endl;
cout<<"------- runs here means, does't crash-------"<<endl;
输出如下:
-------create map<int, MapValue>-------
ctor: 1
ctor: 2
dtor: 2
dtor: 1
dtor: 2
dtor: 1
-----cout key[2]-----
MapValue: 2
-----cout key[5]-----
ctor: 0
MapValue: 0
-------runs here means, does't crash-------
dtor: 0
dtor: 2
dtor: 1
我们可以看到:idName[5]
invoke map构造{5, MapValue(0)}
以插入到idName。
但是,如果您通过调用成员函数idName[5]
,则程序将崩溃:
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
idName[5].toString(); // get crash here.
cout<<"------- runs here means, doesn't crash-------"<<endl;
请查看out_of_range异常:http ://www.cplusplus.com/reference/stdexcept/out_of_range/
如果键不存在,则map :: at和map :: operator []将抛出此错误。您可以按链接中的矢量示例一样捕获它。
您还可以使用:http : //www.cplusplus.com/reference/map/map/find/
并对照map :: end