C ++ map添加了新元素

时间:2012-01-10 16:44:00

标签: c++ linux

我在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'的空值。有没有办法限制地图插入默认值。

6 个答案:

答案 0 :(得分:8)

如果您不想要默认插入,则应使用map.find代替operator []

map::find

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;
}