STL的map表里有一个erase方法用来从一个map中删除掉指令的节点
eg:
map<string,string> mapTest;
typedef map<string,string>::iterator ITER;
ITER iter=mapTest.find(key);
mapTest.erase(iter);
typedef map<string,string>::iterator ITER;
ITER iter=mapTest.find(key);
mapTest.erase(iter);
像上面这样只是删除单个节点,map的形为不会出现任务问题,
但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.
像下面这样的一个例子就是错误的写法,
eg:
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}
这是一种错误的写法,会导致程序行为不可知.究其原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。
可以用以下方法解决这问题:
正确的写法
1.使用删除之前的迭代器定位下一个元素。STL建议的使用方式
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter++);
}
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter++);
}
2. erase() 成员函数返回下一个元素的迭代器
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
iter=mapTest.erase(iter);
}
{
cout<<iter->first<<":"<<iter->second<<endl;
iter=mapTest.erase(iter);
}
相关推荐
11. **map的其他方法** - `count(key)`:返回给定键在map中出现的次数(对于map来说总是1或0)。 - `lower_bound(key)`:返回第一个大于或等于给定键的元素的迭代器。 - `upper_bound(key)`:返回第一个大于给定键...
### VC STL map 使用方法详解:添加,查找,删除 在C++编程中,`map`容器是标准模板库(STL)中一个非常强大的数据结构,用于存储键值对,其中键是唯一的,且默认情况下按照键的升序排列。在Visual C++ (VC) 编译...
`stlmap2.dsp`和`stlmap2.dsw`是Visual Studio的项目文件,用于组织和管理源代码;`a.cpp`可能包含了实际的STL map测试代码;而`.opt`, `.plg`, `.ncb`等文件则是VS的工作区设置和编译过程中的中间文件。 在项目`a....
在STL中,`map`的数据结构通常实现为红黑树,这使得它具有O(log n)的时间复杂度,非常适合进行查找、插入和删除操作。 ### 1. `map`的基本使用 创建一个`map`非常简单,只需要声明一个`map`类型,并指定键和值的...
其中,`map`容器是STL中的一种关联容器,用于存储键值对(key-value pairs),它按照键的顺序进行排序,提供了类似于字典的功能。在本例子中,我们将深入探讨`map`的基本操作,包括插入元素、删除元素、修改元素以及...
在这个“STL-map.rar”压缩包中,我们找到了名为“STL-map.mht”的文件,它可能包含有关C++ `map`的详细解释和实例代码。 `map`的主要功能是提供一种基于键进行查找的数据结构,它的内部实现通常是一个红黑树,确保...
其中,`map`容器是STL中用于存储键值对(key-value pairs)的数据结构,适用于关联式查找和操作。本文将深入解析STL中的`map`用法,帮助你理解其基本概念、操作和应用场景。 1. **map的基本概念** `map`是一个关联...
STL(Standard Template Library,标准模板库)是C++中...总之,理解和正确使用STL容器的`erase`函数对于优化代码和避免运行时错误至关重要。在遍历和删除元素时,应始终考虑迭代器或索引的更新,以及容器的状态变化。
总结,C++的STL`map`容器是处理键值对数据的强大工具,其增删查改操作高效且易于使用。学习并熟练掌握`map`的使用,能够显著提升C++编程的效率和代码质量。在实际编程中,我们应根据需求选择合适的容器,充分利用STL...
在这个“stl_map.rar”压缩包中,作者分享了一个自编的STL库实现,特别是针对map容器的部分。Map在C++中是一个关联容器,它按照键(key)的顺序来存储元素,每个键值对应一个值(value),并且键值是唯一的。 首先...
3. 删除:`map::erase()`方法可以删除特定键值对或者一个范围内的元素。 4. 访问:`map::operator[]`允许通过键直接访问或插入元素,如果键不存在,会自动插入一个新元素。 5. 遍历:可以使用迭代器遍历所有元素,...
`Maptest.cpp`和`rb_treeTest.cpp`可能是测试用例,用来验证`map`和红黑树的实现是否正确。这些测试用例通常会覆盖各种操作,如插入、查找、删除,以及遍历等。 `rb_tree_iterator.h`可能包含红黑树的迭代器实现,...
在提供的文件列表中,`agtbouns.cpp`可能是一个示例程序,展示了如何在C++中使用STL的`map`。`bonuses.dat`可能是包含数据的数据文件,这些数据可能被程序读取并插入到`map`中。`cpl.bat`可能是一个批处理文件,用于...
下面将详细介绍STL中`map`的使用方法。 ### 1. `map`的基本概念 `map`是一个红黑树实现的关联容器,它的每个元素都是一个键值对(key-value pair)。键通常用来唯一标识元素,而值则是与键相关联的数据。`map`保证...
在这个主题中,我们将重点讨论STL容器之一——`map`的使用。`map`是一个关联容器,它可以存储键值对(key-value pairs),其中每个键都是唯一的,并且通过键来访问对应的值。 ### 1. `map`的基本概念 `map`是一个...
在C++编程语言中,STL(Standard Template Library,标准模板库)是极其重要的组成部分,它提供了一系列高效、灵活的数据结构和算法。其中,`map`是一个关联容器,它存储键值对,允许通过键来查找对应的值。本文将...
本教程将深入探讨`map`容器的基本概念、特性以及如何在实际编程中使用。 `map`容器的主要特点: 1. **键值对**:`map`中的每个元素都是一个键值对,由一个键(key)和一个关联的值(value)组成。键必须是唯一的,...
* 删除元素:我们可以使用 erase() 方法来删除元素,例如 `enumMap.erase(1);` 可以删除关键字为 1 的条目。 Algorithm 简介 algorithm 部分主要由头文件 `<algorithm>` 组成,提供了一些常用的算法来处理数据。 ...
6. **删除操作**:`map::erase`函数可以删除单个元素或指定范围的元素。`map::clear`函数则删除Map中的所有元素。 7. **大小和容量**:`map::size()`返回元素数量,`map::empty()`检查Map是否为空,`map::max_size...
在这个例子中,我们关注的是STL中的`map`容器,它是一个关联容器,可以将键(key)与值(value)进行一对一的映射。 `map`容器的主要特性: 1. **有序性**:`map`中的元素是按照键的升序排列的。这意味着你可以快速...