C++ 如果键不存在,则使用[]运算符访问STL映射元素会添加新元素
在windows操作系统中,我使用[]操作符访问STL映射元素,如果键不存在,则使用默认值添加新元素。如何避免这种情况C++ 如果键不存在,则使用[]运算符访问STL映射元素会添加新元素,c++,stl,C++,Stl,在windows操作系统中,我使用[]操作符访问STL映射元素,如果键不存在,则使用默认值添加新元素。如何避免这种情况 #include <iostream> #include <map> #include <string> int main () { std::map<char,std::string> mymap; mymap['a']="an element"; mymap['b']="another element";
#include <iostream>
#include <map>
#include <string>
int main ()
{
std::map<char,std::string> mymap;
mymap['a']="an element";
mymap['b']="another element";
mymap['c']=mymap['b'];
std::cout << "mymap['a'] is " << mymap['a'] << '\n';
std::cout << "mymap['b'] is " << mymap['b'] << '\n';
std::cout << "mymap['c'] is " << mymap['c'] << '\n';
std::cout << "mymap['d'] is " << mymap['d'] << '\n';
std::cout << "mymap now contains " << mymap.size() << " elements.\n";
return 0;
}
Output:
mymap['a'] is an element
mymap['b'] is another element
mymap['c'] is another element
mymap['d'] is
mymap now contains 4 elements
对元素“d”的访问在映射中添加新元素,并将其初始化为默认值。如何避免在访问元素时添加新元素?如果要确定对象是否已在映射中,请使用映射的“查找成员”功能
#include <iostream>
#include <map>
#include <string>
template <class Map, class Key>
void show(Map const &map, Key key) {
auto pos = map.find(key);
if (pos == map.end()) {
std::cout << "key: '" << key << "' was not found\n";
}
else {
std::cout << "key: " << key << ", value: " << pos->second << "\n";
}
}
int main ()
{
std::map<char, std::string> mymap {
{ 'a', "an element" },
{ 'b', "another element" }
};
mymap['c'] = mymap['b'];
show(mymap, 'a');
show(mymap, 'b');
show(mymap, 'c');
show(mymap, 'e');
std::cout << "mymap now contains " << mymap.size() << " elements.\n";
return 0;
}
如果要确定对象是否已在地图中,请使用地图的“查找成员”功能
#include <iostream>
#include <map>
#include <string>
template <class Map, class Key>
void show(Map const &map, Key key) {
auto pos = map.find(key);
if (pos == map.end()) {
std::cout << "key: '" << key << "' was not found\n";
}
else {
std::cout << "key: " << key << ", value: " << pos->second << "\n";
}
}
int main ()
{
std::map<char, std::string> mymap {
{ 'a', "an element" },
{ 'b', "another element" }
};
mymap['c'] = mymap['b'];
show(mymap, 'a');
show(mymap, 'b');
show(mymap, 'c');
show(mymap, 'e');
std::cout << "mymap now contains " << mymap.size() << " elements.\n";
return 0;
}
使用find而不是[]。如下所示:map::iterator it=mymap.find'a。
Find将返回一个迭代器,该迭代器指向具有用于查找的键的对象。对象是由键和值组成的成对对象。所以,您可以通过它->第一个键和它->第二个值来访问它们
如果在映射中找不到键,那么它将返回表示映射结束的结束迭代器。因此,您可以检查迭代器是否等于mymap.end
使用find而不是[]。如下所示:map::iterator it=mymap.find'a。
Find将返回一个迭代器,该迭代器指向具有用于查找的键的对象。对象是由键和值组成的成对对象。所以,您可以通过它->第一个键和它->第二个值来访问它们
如果在映射中找不到键,那么它将返回表示映射结束的结束迭代器。因此,您可以检查迭代器是否等于mymap.end
使用find而不是[]。[]在映射上是方便的,但它返回对映射中的值的引用。因此,如果地图条目不存在,它必须创建它才能拥有该引用。如果元素不存在,你希望发生什么?@juanchopanza-如果键不存在,我只是不想在访问元素时在地图中添加新元素。因为在我的代码中,当检查映射的大小时,它给出的大小为非零,这使我的逻辑失败。我也很好奇,当元素还没有在映射中时,您还期望发生什么。在其他语言中,您会遇到异常,但是C++不是触发异常的触发器,它们是为例外保留的。cases@usermgs如果你对我的回答满意,你可以接受使用find而不是[]。[]在映射上是方便的,但它返回对映射中的值的引用。因此,如果地图条目不存在,它必须创建它才能拥有该引用。如果元素不存在,你希望发生什么?@juanchopanza-如果键不存在,我只是不想在访问元素时在地图中添加新元素。因为在我的代码中,当检查映射的大小时,它给出的大小为非零,这使我的逻辑失败。我也很好奇,当元素还没有在映射中时,您还期望发生什么。在其他语言中,您会遇到异常,但是C++不是触发异常的触发器,它们是为例外保留的。cases@usermgs如果你对我的回答满意,你可以接受@如果您对我的答案感到满意,您可以接受我的答案@如果您对我的答案感到满意,您可以接受我的答案