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

为什么std::map::erase(iterator it)是分期常量?

std::map::erase(iterator it)是分期常量的原因是为了保证操作的时间复杂度为O(logN)。

在std::map中,元素是按照键值有序存储的,使用红黑树实现。当调用erase(iterator it)函数时,需要删除指定迭代器所指向的元素。由于红黑树的特性,删除一个节点可能会导致整个树的结构发生变化,需要进行平衡操作,以保持树的平衡性。

为了保证操作的时间复杂度为O(logN),std::map::erase(iterator it)函数将删除操作分为两个阶段:标记和删除。在标记阶段,被删除节点的颜色会被标记为“删除”,但实际上并不会立即删除节点。在删除阶段,会根据需要进行平衡操作,最终删除节点并释放内存。

这种分期常量的设计可以保证删除操作的时间复杂度为O(logN),但也意味着在调用erase函数后,被删除节点的内存并不会立即释放,直到整个删除过程完成才会释放。因此,std::map::erase(iterator it)是分期常量。

推荐的腾讯云相关产品:腾讯云数据库TencentDB、腾讯云云服务器CVM、腾讯云容器服务TKE。

腾讯云数据库TencentDB:https://cloud.tencent.com/product/cdb 腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm 腾讯云容器服务TKE:https://cloud.tencent.com/product/tke

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

相关·内容

  • C++认识容器的迭代器

    所以,在删除一个元素的时候,没有什么问题的。即: for(map::iterator it=countMap.begin();it!...map::iterator nextIt=countMap.begin(); for(map::iterator it=countMap.begin()...再者map.erase()返回指向紧接着被删除元素的下一个元素的迭代器,所以可以实现如下: for(map::iterator it=countMap.begin();it!...的交换的时间复杂度常量级,一般情况下,拷贝带来的时间开销会大于删除指定元素的时间开销,并且临时map容器也增加了空间的开销。...Iterator的自增方法其实就是增加内部的一个索引值。判断!=的方法和另外一个迭代器做比较,这个迭代器一般集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代器已经达到了末尾。

    1.2K10

    C++ 认识容器的迭代器

    所以,在删除一个元素的时候,没有什么问题的。即: for(map::iterator it=countMap.begin(); it!...再者 map.erase() 返回指向紧接着被删除元素的下一个元素的迭代器,所以可以实现如下: for(map::iterator it=countMap.begin();it!...的交换的时间复杂度常量级,一般情况下,拷贝带来的时间开销会大于删除指定元素的时间开销,并且临时map容器也增加了空间的开销。...: std::string str[10]; }; 我们定义了个内部的嵌套类Iterator,并为它重载了++、*、!...Iterator的自增方法其实就是增加内部的一个索引值。判断!=的方法和另外一个迭代器做比较,这个迭代器一般集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代器已经达到了末尾。

    60120

    STL之关联式容器map(二)

    \n"; 4.获取元素 获取 map 容器的开始和结束迭代器以及反向迭代器,它们都可以访问容器中的所有元素。 map 的成员函数 at() 返回的参数键对应的对象。...6删除元素 map 的成员函数 erase() 可以移除键和参数匹配的元素,然后返回所移除元素的个数。...<< " was not found" << std::endl; map 容器的返回值只可能 0 或 1,0 表明元素不在容器中。...也可以用指向删除元素的迭代器作为 erase() 的参数。这种情况下,返回的迭代器指向被删除元素的下一个位置。这个参数必须容器中的有效迭代器,不能结束迭代器。...auto iter = people.erase(++std::begin(people), --std::end(people));//Erase all except 1st & last 返回的迭代器指向这段元素中最后一个被删除的元素

    55120

    【C++】STL 容器 - vector 动态数组容器 ⑧ ( vector 容器添加 删除元素 | clear 函数 | insert 函数 | erase 函数 )

    函数 iterator 迭代器类 的 erase 函数 删除 指定 索引位置 的元素 ; iterator#erase() 函数原型如下 : iterator erase( const_iterator...pos ); 该 erase() 函数 接受一个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素之后元素的迭代器 ; 注意 : 返回的 新的迭代器 , 需要重新使用变量接收该迭代器...函数 iterator 迭代器类 的 erase 函数 删除 指定 范围区间 的元素 ; 注意 : 迭代器 范围一个 前闭后开 区间 , 下面的代码 只能删除 2 个元素 , 即 第一个和第二个元素...; // 删除容器中第一个和第二个元素 vec.erase(vec.begin(), vec.begin() + 2); iterator#erase() 函数原型如下 : iterator...erase( const_iterator first, const_iterator last ); iterator#erase() 函数 接受两个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素范围的结束位置之后的迭代器

    2.8K11

    c++ 迭代器失效_c++迭代器是什么

    正向迭代器,定义方法如下: 容器类名::iterator 迭代器名; 常量正向迭代器,定义方法如下: 容器类名::const_iterator 迭代器名; 反向迭代器,定义方法如下: 容器类名:...:reverse_iterator 迭代器名; 常量反向迭代器,定义方法如下: 容器类名::const_reverse_iterator 迭代器名; 1.3 迭代器的使用 通过迭代器可以读取它指向的元素...;这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置,此时 iter 已经指向的未知内存;解决方法利用 erase方法可以返回下一个有效的 iterator...---- 节点式容器: 关联式容器(如map, set,multimap,multiset) (1)删除当前的iterator,仅仅会使当前的iterator失效,只要在erase 时,递增当前 iterator...链表式容器(如list) (1)删除当前的iterator,仅仅会使当前的iterator失效,只要在erase 时,递增当前 iterator erase(iter++)或者 利用 erase 返回的有效迭代器

    1.1K40

    C++常见避坑指南

    _CONSTEXPR20 iterator erase(const_iterator _First, const_iterator _Last) noexcept( is_nothrow_move_assignable_v...可以利用erase迭代器接口返回的下一个有效的迭代器,或者将当前的迭代器指向下一个erase(iter++)。...值得一提的,在最新的C++11标准中,已经新增了一个map::erase函数执行后会返回下一个元素的iterator,因此可以使用erase的返回值获取下一个有效的迭代器。...在实现上有两种模板,其一通过 erase 获得下一个有效的 iterator,使用于序列式迭代器和链表式迭代器(C++11开始关联式迭代器也可以使用) for (auto it = elements.begin...,但是因为类型错了还是会发生拷贝,std::map 中的键值对是以 std::pair 的形式存储的,其中key常量

    45310

    C++11:基于std::unordered_map和共享锁构建线程安全的map

    在上一篇博客中,实现threadsafe_queue主要是依赖std::mutex信号量来实现线程对threadsafe_queue的独占访问,不论只读的函数还是写函数对threadsafe_queue...所以在实现线程安全的map时,我没有选择使用std::mutex控制所有的操作为独占访问,而是用RWLock来控制map对象的访问,RWLock我以前自己写的一个类,将线程对资源的访问分为读取操作和写入操作两类...return map.erase(__position); } iterator erase(iterator __position){ auto guard=lock.write_guard...guard=lock.write_guard(); return map.erase(__x); } iterator erase(const_iterator __first..., const_iterator __last){ auto guard=lock.write_guard(); return map.erase(__first, __

    8.8K10

    C++ vector 使用详解(含C++20新特性)

    & std::erase_if (std::vector)  简介  C++ 的 vector 本质上一个动态数组,它的元素连续存储的,这意味着不仅可以通过迭代器访问元素,还可以使用指向元素的常规指针来对其进行访问...介绍两个关键词  (1) constexpr C++11 中新增的关键字,其语义 "常量表达式",也就是在编译期可求值的表达式。...最基础的常量表达式就是字面值或全局变量/函数的地址或 sizeof 等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。...begin、end 与 cbegin、cend的区别是后者指向常量的指针,在使用的过程中不允许改变指向内容的值。此元素充当占位符;尝试访问它会导致未定义的行为。 ...() 从容器中删除指定的元素  iterator erase( const_iterator pos ); iterator erase( const_iterator first, const_iterator

    1.9K30

    C++进阶:详细讲解容器set与map(pair、multiset、multimap)

    1.关联式容器与序列式容器 关联式容器和序列式容器 C++ 中两种不同的容器类型 关联式容器: 关联式容器主要包括 std::set, std::map, std::multiset, std:...插入、删除、查找等操作的平均时间复杂度 O(log n)。 序列式容器: 序列式容器包括 std::vector, std::list, std::deque, std::array 等。...3.3.2 erase() 删除 函数声明 功能介绍 返回值 iterator erase(iterator position); 删除指定位置的元素,并返回指向被删除元素之后元素的迭代器。...iterator erase(iterator first, iterator last); 删除区间 [first, last) 中的所有元素,并返回最后一个被删除元素之后的迭代器。...const_iterator find(const key_type& k) const; 在常量 map 中查找键值为 k 的元素,并返回一个指向该元素的迭代器。

    24310

    【Example】C++ 标准库常用容器全面概述

    在某个元素后插入新元素 emplace_after 在元素后原位构造元素 erase_after 擦除元素后的元素 std::deque 双端队列,具有下标与逻辑相邻顺序的容器。...插入元素不会使任何 iterator 无效,删除元素只会使指向已删除元素的 iterator 失效。...Map 与 set 不同的map 系列键值与值对应的形式,即 Key : Value 成对出现。基于红黑树的 map 会根据键的大小自动升序排序,基于哈希表的则无序。...(在std::multimap中不提供) begin 返回一个迭代器,此迭代器指向Map起始位置。 cbegin 返回一个常量迭代器,此常量迭代器指向Map起始位置。...第一个迭代器指向Map中其键大于指定键的第一个元素。第二个迭代器指向Map中其键等于或大于指定键的第一个元素。 erase 从指定位置移除Map中的元素或元素范围。

    3.3K30
    领券