我在C ++地图中有一个基本查询,
map<char,string> mymap;
mymap['a']="an element";
mymap['b']="another element";
mymap['c']=mymap['b'];
cout << "mymap['a'] is " << mymap['a'] << endl;
cout << "mymap['b'] is " << mymap['b'] << endl;
cout << "mymap['c'] is " << mymap['c'] << endl;
cout << "mymap['d'] is " << mymap['d'] << endl;
当我们尝试访问mymap ['d']时,我得到一个默认值,因为运算符使用该键在地图中插入一个新元素并初始化为其默认值,即使访问该元素只是为了检索其值。下次当我使用迭代器时,我可以看到键'd'的空值。有没有办法限制地图插入默认值。
答案 0 :(得分:8)
如果您不想要默认插入,则应使用map.find
代替operator []
。
iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;
在容器中搜索x为键的元素,如果找到则返回迭代器,否则返回map :: end 的迭代器(超过容器末尾的元素)< / p>
答案 1 :(得分:1)
这是std::map
的预期和记录的行为。要检查某个项目是否存在,请使用find
。
答案 2 :(得分:1)
仅使用map的成员函数iterator find(const key_type& k)
进行查询。
map的operator []有一些'特殊效果'
data_type& operator[](const key_type& k)
返回对与特定键关联的对象的引用。如果映射尚未包含此类对象,则operator []将插入默认对象data_type()。 [3]
可以在以下网站找到更多参考资料 http://www.sgi.com/tech/stl/Map.html
答案 3 :(得分:0)
map<char, string>::iterator mIte = mymap.find('d');
if(mIte != mymap.end())
cout << "mymap['d'] is " << mIte->second << endl;
else
cout << "mymap['d'] is empty" << endl;
答案 4 :(得分:0)
这不仅是记录在案的行为,而且稍微想一想,很容易理解为什么。索引操作只有两个明智的结果:要么返回映射中的有效条目,要么抛出异常。如果您不抛出异常,那么唯一的选择是创建一个新条目。我不知道为什么标准选择了一个而不是另一个,但就是这样。
Microsoft提供的at
方法会抛出而不是创建元素,但这似乎不在标准中或gcc中。
创建一个使用find
执行相同操作的函数很容易:
template<typename Key, typename Value>
Value& at(std::map<Key,Value> & the_map, const Key & the_key)
{
std::map<Key,Value>::iterator it = the_map.find(the_key);
if (it == the_map.end())
throw std::out_of_range("map index invalid");
return it->second;
}
template<typename Key, typename Value>
const Value& at(const std::map<Key,Value> & the_map, const Key & the_key)
{
std::map<Key,Value>::const_iterator it = the_map.find(thekey);
if (it == the_map.end())
throw std::out_of_range("map index invalid");
return it->second;
}
答案 5 :(得分:0)
operator[]
将始终插入默认值。
在C ++ 11中,mymap.at('d')
将抛出out_of_range
,而不会插入默认值。
在C ++ 03中,您可以使用find
:
template <typename Key, typename Value, typename C, typename A>
Value at(std::map<Key,Value,C,A> const & map, Key const & key)
{
typename std::map<Key,Value,C,A>::const_iterator found = map.find(key);
if (found == map.end()) {
throw std::out_of_range("at(map,key)");
}
return found->second;
}