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

为什么g ++ 版本的map <T> :: erase(map :: <T> iterator)不返回迭代器?

在C++中,std::map<T>::erase()函数用于删除指定位置的元素,并返回一个指向下一个元素的迭代器。当使用g++编译器时,std::map<T>::erase()函数可能不返回迭代器,这可能是因为g++编译器的实现与其他编译器的实现略有不同。

在C++标准库中,std::map<T>::erase()函数的定义如下:

代码语言:c++
复制
iterator erase(iterator position);

该函数接受一个迭代器作为参数,并返回一个指向下一个元素的迭代器。因此,如果您在使用g++编译器时遇到了std::map<T>::erase()函数不返回迭代器的问题,可以尝试使用以下代码来解决:

代码语言:c++
复制
std::map<T> my_map;
// ...
std::map<T>::iterator it = my_map.find(key);
if (it != my_map.end()) {
    std::map<T>::iterator next_it = my_map.erase(it);
    // 使用next_it迭代器继续访问下一个元素
}

在这个示例中,我们首先使用std::map<T>::find()函数找到要删除的元素。然后,我们使用std::map<T>::erase()函数删除该元素,并将返回的迭代器存储在next_it变量中。最后,我们使用next_it迭代器继续访问下一个元素。

总之,g++编译器的实现可能导致std::map<T>::erase()函数不返回迭代器。为了解决这个问题,您可以使用std::map<T>::find()函数和返回的迭代器来访问下一个元素。

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

相关·内容

STL之关联式容器map(二)

emplace_hint() 的返回值不是一个 pair 对象,如果新元素被插入,它返回的是指向新元素的迭代器;如果没有插入,返回的是和这个键匹配的现有元素的迭代器。...\n"; 4.获取元素 获取 map 容器的开始和结束迭代器以及反向迭代器,它们都可以访问容器中的所有元素。 map 的成员函数 at() 返回的是参数键对应的对象。...也可以用指向删除元素的迭代器作为 erase() 的参数。这种情况下,返回的迭代器指向被删除元素的下一个位置。这个参数必须是容器中的有效迭代器,不能是结束迭代器。...如果迭代器参数指向的是容器的最后一个元素,那么会返回结束迭代器。...erase(),它可以移除两个迭代器参数所定义范围内的元素。

56620

【C++】unordered系列容器的封装

但对应迭代的速度比较慢。 unordered_map允许[ ]下标访问! unordered_map只有正向迭代器!没有反向迭代器!...他们都提供以下接口: 迭代器 函数 功能介绍 begin 返回unordered_map第一个元素的迭代器 end 返回unordered_map最后一个元素下一个位置的迭代器 cbegin 返回...unordered_map第一个元素的const迭代器 cend 返回unordered_map最后一个元素下一个位置的const迭代器 功能函数 函数 功能介绍 iterator find(const...K& key) 返回key在哈希桶中的位置 size_t count(const K& key) 返回哈希桶中关键码为key的键值对的个数 insert 向容器中插入键值对 erase 删除容器中的键值对...,再在hashtable中实例化普通迭代器和const迭代器: //迭代器 typedef _HTIteratorT&, T*> iterator; //const 迭代器 typedef _HTIterator

11410
  • 【C++】map和set使用

    val 不存在返回 0 ,存在返回 1 size_type erase ( const value_type& val); // 删除⼀段迭代器区间的值 iterator...erase (const_iterator first, const_iterator last); // 返回⼤于等 val 位置的迭代器 iterator lower_bound...map的⽀持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for,map⽀持修改value数据,不⽀持修改key数据,修改关键字数据...// 删除⼀个迭代器位置的值 iterator erase (const_iterator position); // 删除 k , k 存在返回 0 ,存在返回 1...map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map还有⼀个⾮常重要的修改接⼝operator[],但是operator[]不仅仅⽀持修改,还⽀持插

    7410

    再探 setmap

    map篇 放码过来 map的迭代器 自定义排序 [] 运算符重载函数 C++map迭代器的++操作是如何实现的?...---- 元素的检索 使用find()方法对set进行检索。找到则返回元素位置的迭代器,不然返回end()。 这个我熟,就不多说了。...,并返回指向该元素的迭代器 s.upper_bound(x)表示查找>x的元素中最小的一个,并返回指向该元素的迭代器 举个例子: 在set{3,5,7,8,13,16}中 对于在set中存在的元素,比如...8 s.lower_bound(8)返回8所在位置的迭代器 s.upper_bound(8)返回13所在位置的迭代器 对于在set中不存在的元素,比如12 两个函数返回的则都是13所在位置的迭代器 特殊地...(x); } iterator upper_bound(const key_type& x) {return t.upper_bound(x); } }; ---- map的迭代器 map的所有元素都会根据元素的键值自动排序

    70420

    【C++】详解 set && multiset && map && multiset 的使用

    set 中的元素不允许修改,为什么? 因为 set 的底层的迭代器是 const_iterator。...> sixth(fn_pt); // 函数指针作为比较 return 0; } ③ 迭代器 函数声明 功能 iterator begin() 返回 set 中起始位置元素的迭代器 iterator...end() 返回 set 中最后一个元素后面的迭代器 reverse_iterator rbegin() 返回 set 第一个元素的反向迭代器,即 end reverse_iterator rend(...) 返回 set 最后一个元素下一个位置的反向迭代器,即rbegin 每个迭代器都还有 const 版本的,但是这里就不列举出来了,因为 set 其实底层用的就是 const_iterator,是无法修改的...存迭代器就完美的避开了这个问题! 那为什么不存指针而是存迭代器呢? 解答: 因为为了保持平台可移植性,不同的平台的平衡树指针是不一样的名称的,但是可以确定的是迭代器一定是一样的!

    5500

    走近STL - map,只愿一键对一值

    map的迭代器 这个还是比较关心的东西,如果看了前面几篇的话。 我们不能通过迭代器修改map的键值,因为键值关系到map的排列规则;但是如果要修改实值那是可以的。...map的迭代器和list的迭代器有一定的相似之处,当客户端对map使用增删操作之后,迭代器仍然是有效的,那个被删除节点的迭代器是个例外。...3、与map相关的方法 还是选取最朴实无华的,但确是最实用的并经过亲测的方法,兼容VC98版本编译器。...it = maptest.begin(); maptest.erase(it); //通过迭代器删除,有任何问题可以参见前面提到的迭代器 maptest.erase(maptest.begin(),...maptest.end()); //成片删除,很遗憾,这个不遵循左开右闭原则,全删了1 查 // 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器 // 根据map的类型,返回的迭代器为

    59020

    【C++】map和set的介绍及使用

    // 删除⼀个迭代器位置的值 iterator erase(const_iterator position); // 删除val,val不存在返回0,存在返回1 size_type erase...; // 返回⼤于等val位置的迭代器 iterator lower_bound(const value_type& val) const; // 返回⼤于val位置的迭代器 iterator...map的⽀持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛ 的中序;⽀持迭代器就意味着⽀持范围for,map⽀持修改value数据,不⽀持修改key数据,修改关键 字数据...⼀段迭代器区间的值 iterator erase(const_iterator first, const_iterator last); // 返回⼤于等k位置的迭代器 iterator lower_bound...map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map 还有⼀个⾮常重要的修改接⼝operator[],但是operator[]不仅仅⽀持修改,还⽀

    7600

    C++ STL-map与set的使用

    iterator erase (const_iterator first, const_iterator last); // 返回⼤于等val位置的迭代器 iterator lower_bound...multiset:在multiset中,erase操作同样可以删除指定元素,但如果有多个相同的元素,它会删除所有匹配的元素(除非指定了只删除一个的迭代器版本)。...删除⼀个迭代器位置的值 iterator erase (const_iterator position); // 删除k,k存在返回0,存在返回1 size_type erase (const key_type...& k); // 删除⼀段迭代器区间的值 iterator erase (const_iterator first, const_iterator last); // 返回⼤于等k位置的迭代器 iterator...map的insert()方法返回一个pairiterator, bool>,其中迭代器指向插入的位置(或已存在的元素),而布尔值表示插入是否成功。

    5110

    C++:set和map的使用

    & val) const; //1.删除一个迭代器位置的值 iterator erase(const_iterator position); //2.删除val,val不存在返回0,存在返回1...last); //返回大于等于val位置的迭代器 iterator lower_bound(const value_type& val) const; //返回大于val位置的迭代器 iterator.../1.删除一个迭代器位置的值 iterator erase (const_iterator position); //2.删除val,val不存在返回0,存在返回1 size_type erase...(const key_type& k) const; //删除一个迭代器位置的值 iterator erase(const_iterator position); //删除k,k存在返回0,存在返回...与set中的erase一模一样,就不做演示了 } 关于insert这个函数,它返回的是一个pair,但这pair不是map里的pair,insert返回的pair的key是map的迭代器,value是一个

    12010

    C++ STL 中的 map:高效管理键值对的有序容器

    // 反向迭代器 reverse_iterator rbegin(); reverse_iterator rend(); map的增删查 map的增删查关注以下⼏个接⼝即可: map增接口,插入的...last); // 查找k,返回k所在的迭代器,没有找到返回end() iterator find (const key_type& k); // 查找k,返回k的个数 size_type count...(const key_type& k) const; // 删除⼀个迭代器位置的值 iterator erase (const_iterator position); // 删除k,k存在返回0,...存在返回1 size_type erase (const key_type& k); // 删除⼀段迭代器区间的值 iterator erase (const_iterator first, const_iterator...last); // 返回⼤于等k位置的迭代器 iterator lower_bound (const key_type& k); // 返回⼤于k位置的迭代器 const_iterator lower_bound

    9410

    封装红黑树实现mymap和myset

    之前使⽤部分,我们分析了,map和set的迭代器⾛ 的是中序遍历,左⼦树->根结点->右⼦树,那么begin()会返回中序第⼀个结点的iterator也就是10 所在结点的迭代器。...相⽐我们⽤ nullptr作为end(),差别不⼤,他能实现的,我们也能实现。只是--end()判断到结点时空,特殊处 理⼀下,让迭代器结点指向最右结点。具体参考迭代器--实现。...set的iterator也不⽀持修改,我们把set的第⼆个模板参数改成const K即可, RBTree _t; map的iterator不⽀持修改key但是可以修改value,我们把map的第⼆个模板参数...typedef RBTreeNodeT> Node; public: typedef RBTreeIteratorT, T&, T*> Iterator; //const T&,表示解引用迭代器时返回的是一个对...typedef RBTreeNodeT> Node; public: typedef RBTreeIteratorT, T&, T*> Iterator; //const T&,表示解引用迭代器时返回的是一个对

    7010

    C++ —— map系列的使用

    ,bool>对象,返回pair对象 first是key所在结点的迭代器,second是false 2、如果key不在在map中,插⼊成功,则返回⼀个pairiterator,bool>对象,...pairT>,另⼀个是insert返回值pairiterator,bool> 如果插入成功就会返回pair的key的迭代器,true>,插入失败就返回pair<原来就存在相同...; // 删除⼀段迭代器区间的值 iterator erase (const_iterator first, const_iterator last); //删除 int main() { map...的数据修改 map⽀持修改mapped_type 数据,不⽀持修改key数据,修改关键字数据,破坏了底层搜 索树的结构 map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key...k所在的迭代器,没有找到返回end(),如果找到了通过iterator可以修改key对应的mapped_type值 iterator find (const key_type& k); 6. map

    6210

    封装红黑树实现mymap和myset--C++

    源码及框架分析 SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等几个头文件中。...= y.node; } iterator实现思路分析 iterator实现的大框架跟list的iterator思路是一致的,用一个类型封装结点的指针,再通过重载运算符实现,迭代器像指针一样访问的行为。...之前使用部分,我们分析了,map和set的迭代器走的是中序遍历,左子树->根结点->右子树,那么begin()会返回中序第一个结点的iterator也就是10所在结点的迭代器。...迭代器++的核心逻辑就是不看全局,只看局部,只考虑当前中序局部要访问的下一个结点。...map支持[] map要支持[]主要需要修改insert返回值支持,修改RBtree中的insert返回值为 pairIterator, bool> Insert(const T& data) 有了insert

    6410

    (清晰易懂版)(multi)map和set--C++

    & val); // 查找val,返回Val的个数 size_type count (const value_type& val) const; // 删除⼀个迭代器位置的值 iterator erase...(const_iterator position); // 删除val,val不存在返回0,存在返回1 size_type erase (const value_type& val); // 删除⼀段迭代器区间的值...iterator erase (const_iterator first, const_iterator last); // 返回⼤于等val位置的迭代器 iterator lower_bound...(const key_type& k) const; // 删除⼀个迭代器位置的值 iterator erase (const_iterator position); // 删除k,k存在返回0,存在返回...map第一个支持修改的方式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map还有一个非常重要的修改接口operator[],但是operator[]不仅仅支持修改,还支持插入数据和查找数据

    7200

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

    之前使⽤部分,我们分析了,map和set的迭代器⾛ 的是中序遍历,左⼦树->根结点->右⼦树,那么begin()会返回中序第⼀个结点的iterator也就是10 所在结点的迭代器。...相⽐我们⽤ nullptr作为end(),差别不⼤,他能实现的,我们也能实现。只是--end()判断到结点时空,特殊处 理⼀下,让迭代器结点指向最右结点。具体参考迭代器--实现。...set的iterator也不⽀持修改,我们把set的第⼆个模板参数改成const K即可, RBTree<K, const K , SetKeyOfT> _t; map的iterator不..._t; ⽀持完整的迭代器还有很多细节需要修改,具体参考下⾯题的代码。...2.3map⽀持[] map要⽀持[]主要需要修改insert返回值⽀持,修改RBtree中的insert返回值为 pairIterator, bool> Insert(const T& data

    6410

    【C++高阶】深度剖析:从零开始模拟实现 unordered 的奥秘

    = end()) { // 插入失败返回已有节点的迭代器和false return make_pair(it, false); } // 负载因子 if (_n == _tables.size...new Node(data); // 头插 newnode->_next = _tables[hashi]; _tables[hashi] = newnode; ++_n; // 插入成功返回新节点的迭代器和...ture return make_pair(iterator(newnode, this, hashi), true); } // 返回类型修改成了迭代器 iterator Find(const...HashTable的迭代器 迭代器基本设计 代码示例(C++): // 为了实现简单,在哈希桶的迭代器类中需要用到hashBucket本身,所以我们要进行一下前置声明,并且我们在 HashTable 中也要设置一个友元..._hashi),ret.second); } // 因为用到的都是const迭代器,所以非const迭代器我们可以不写 /*iterator begin() { return _ht.begin

    8010

    【C++进阶】unordered_set和unordered_map的模拟实现(附源码)

    unordered_se和unordered_map的底层都是哈希桶。 哈希桶之前已经模拟实现过->哈希表的开散列和闭散列 但是之前并没有实现哈希表的迭代器,接下来将会实现。...一.哈希表迭代器的实现 模板参数的设计 因为 set存储的是key,而map存储的是 K-V 键值对,两个数据类型不一样,但底层又用的都是哈希表,所以在哈希表的模板参数中直接写成 T,但是还需要一个 K...为了适应unordered_set和unordered_map,Insert ,Find,Erase地接口的返回值都要修改。...Insert 的返回值改为 pairIterator,bool> Find和Erase 的返回值改为 Iterator 增加 begin ,end 接口 此时取模的方式也有所变化,先用 KeyofT...因为 insert 接口返回的是一个 pair ,你以为它是普通迭代器,但实际上它是一个 const 迭代器,而底层哈希桶 Insert 接口返回的是一个普通迭代器,这就造成了类型不匹配的问题。

    15710

    【C++】 使用红黑树模拟实现STL中的map与set

    大家想一下map和set都有find,erase这些接口,那它们有什么不同? ,对于set来说,它的查找是不是就是按结点里面存的那个key去查找的啊,返回的是对应元素的迭代器。 而map呢?...而map的查找返回的是整个pair的迭代器(其实还是结点里面元素的迭代器,map里面存的就是pair嘛。)...返回中序遍历最后一个结点的下一个: 那最后一个结点后面就没有元素了啊,所以我们直接用空构造一个迭代器返回就行了 那const版本的begin和end我们也直接写一下: 另外这里稍微有点挑战的就是+...最后返回一下++之后的迭代器。...,大家看 这里_t调用begin,返回的是普通迭代器,但是现在这个返回值iterator是不是红黑树里面const迭代器的typedef,所以这里无法进行类型转换(普通迭代器转换为const迭代器

    16010
    领券