首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么std :: map :: operator []反直觉?

std::map::operator[]在使用时可能会产生反直觉的结果,原因如下:

  1. 插入元素:当使用std::map::operator[]插入一个新的键值对时,如果该键不存在于map中,它会自动创建一个默认值,并将其插入到map中。这意味着即使你没有明确插入该键,也会在map中创建一个默认值。这可能与预期的行为不同,因为在其他容器中,如果键不存在,插入操作会返回一个迭代器,以便你可以进一步操作。
  2. 访问元素:当使用std::map::operator[]访问一个键时,如果该键不存在于map中,它会自动插入一个默认值,并返回对该默认值的引用。这可能会导致一些问题,因为你可能期望在访问不存在的键时返回一个空值或者抛出异常,而不是自动插入一个默认值。
  3. 引用类型:std::map::operator[]返回的是对值的引用,而不是值本身。这意味着你可以直接修改map中的值,但也可能导致一些意外的行为。例如,如果你在访问一个不存在的键时,会自动插入一个默认值,并返回对该默认值的引用,如果你修改了这个引用所指向的值,可能会影响到其他地方对该键的访问。

综上所述,std::map::operator[]的反直觉之处在于它的插入和访问行为可能与预期的不同。为了避免这种反直觉,可以考虑使用std::map的其他成员函数,如find()来判断键是否存在,或者使用at()来访问元素,它会抛出一个异常来指示键不存在。另外,如果你需要更精确地控制插入和访问行为,可以考虑使用std::map的insert()和emplace()函数来代替std::map::operator[]。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

标准关联容器一定比vector的查找速度快吗?

//为什么必须创造一个仿函数类而不是简单地为set写一个比较函数,你可能想这样试试 见 5 //5 bool stringPtrLessSS(const std::string* ps1, const...m[1] = m1; m[2] = m2; //map m -> m[K] = V; map::operator[] //检查k是否已经在map里,如果不,就添加上,以V作为它的对应值...,如果k已经在map里,它的关联值被更新成V /** 原理如下: 1,operator[]返回一个与 k关联的值对象的引用,然后 v赋值给所引用 (从 operator[]返回的) 的对象 2,当要更新一个已存在的键的关联值时很直接...,已经有 operator[] 可以用来返回引用的值对象 3,但是k不再map里,operator[]就没有可以引用的值对象,这样,使用值类型的默认构造函数从头开始建立一个, 然后 operator[]...//也不是,记住 operator[]立即为 添加或更新的意思 //1,当添加时候 ,insert高效 //2,当一个等价的键,更新时,[]高效 //这是为什么呢?

1.8K10

【C++】红黑树封装实现 map 和 set

我们之前在学习 set 和 map 基本使用时就介绍了 set 和 map 底层都是红黑树,但这里有一个问题 – set 是K模型的容器,而 map 是KV模型的容器,那它们底层为什么能同样都使用红黑树呢...multiset;这就是为什么我们使用 multiset 和 multimap 时只需要包 set 和 map 头文件的原因。...和 set 传递过来的 value_type,如下: 通过这张图相信大家就可以很容易理解为什么 set 和 map 虽然是不同模型的容器,但都可以使用 红黑树 作为底层容器了 – 如果是 map,则红黑树的模板参数...到这里有的同学可能会疑惑,既然 _Val 就能区别出 set 和 map,那为什么还要传递第一个模板参数 _Key 呢?...> _t; map 模拟实现的难点在于 operator[](const K& key) 函数的实现 – 在前面map 和 set 的使用那一节中我们知道 map 支持 [] 访问,并且 mapoperator

82930

STL deque源码实现及分析

分析为什么STL的 stack 默认使用deque而不是vector作为底层容器 ---- 分析实现源码,其实我们只用实现,理解几个核心的函数就可以明白其中的原理,并不需要全部的实现。...整体上介绍STL deque,以及其与vector的区别 1.1 overview std::deque ( double-ended queue ,双端队列)是可以进行下标访问的顺序容器,它允许在其首尾两端快速插入及删除元素...最少是 8 个,最多是"所需节点数 + 2" map_size = std::max(initial_map_size(), num_nodes + 2); // 申请配置对应的数组...最少是 8 个,最多是"所需节点数 + 2" map_size = std::max(initial_map_size(), num_nodes + 2); // 申请配置对应的数组 map = mapAllocator...分析为什么STL的 stack 默认使用deque而不是vector作为底层容器 分析为什么STL的 stack 默认使用deque而不是vector作为底层容器?

2.9K30

终极 C++避坑指南

) {} // int→bool int n; while (~scanf("%d", &n)) {} // int→bool 所有表示判断逻辑的语法,都可以用非布尔类型的值传入,这样的写法其实是很人类直觉的...int表示了判断逻辑 if (judge == true) {} // 但这里的条件其实是false,因为true会转为1,2 == 1是false 正是由于非布尔类型具有了布尔意义,才会造成一些非常直觉的事情...; // 不用auto std::unordered_map>::iterator iter = data_map.begin(); // 使用...() {   std::map> ma;   // 例如想给key为(1, 2)新增value为"abc"的   // 由于无法确定外层key...(1).emplace(1, "abc"); } 但是利用try_emplace就可以更取巧一些: void Demo() {   std::map<int, std::map<int, std::string

2.1K20

C++11 为自定义容器实现标准的forward迭代器

为基础开发的,在项目中需要用到哈希表来保持数据,C++11本身已经提供了丰富的容器类型(array,list,hashmap….vector),但因为项目的特殊需要不能使用C++11现成的unordered_map...然后问题了,为了让这个自定义的容器也能像unordered_map一样使用forward(向前)迭代器进行遍历数据,还要为它实现一个forward迭代器。...:public std::iterator{ typedef _HashTable_Iterator _Self;...::iterator, 其实std::iterator只是个元模板,里面没什么内容,主要是定义了迭代器特性(std::iterator_traits),为你的自定义迭代器定义了标准迭代器所需要的的5...default 构造函数)*TYPE(iter)复制迭代器(copy 构造函数)*iter1=iter2对迭代器赋值(assign)* 但在上面的代码中实现中表中打*号的操作都没有实现,代码也能正常编译,具体为什么有时间再研究

48020

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券