- 浏览: 63213 次
- 性别:
- 来自: 武汉
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
或
正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}
下面是两个错误的使用方法:
错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}
或
错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}
正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用 erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。
这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
假如有一个列表 ShipList,里面的内容是0、1、2、3...9, 如果要从中删除那些取余3后为0或为1的数,删除后应该得出的结果是 2、5、8。
但如果是这样操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
这样的话会有两个问题,一个是得出的结果是 1、2、4、5、7、8(没有删除取余3后等于1的数);另外一个问题是当执行到列表中最后一个元素(即ShipList.end() - 1 )时,迭代器可能还会执行两次“++”,如果是这样那么it就到达了 ShipList.end() + 1 的位置,这样也会报错。
erase( itList++) 是先获取下一个元素的位置再删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
我认为,erase(itList++)是itList先传递值给erase(),然后再自增;
erase(++itList) 是先自增,然后再把自增后的值传递给erase(),这个是出错的根源。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
或
正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}
下面是两个错误的使用方法:
错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}
或
错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}
正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用 erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。
这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
假如有一个列表 ShipList,里面的内容是0、1、2、3...9, 如果要从中删除那些取余3后为0或为1的数,删除后应该得出的结果是 2、5、8。
但如果是这样操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
这样的话会有两个问题,一个是得出的结果是 1、2、4、5、7、8(没有删除取余3后等于1的数);另外一个问题是当执行到列表中最后一个元素(即ShipList.end() - 1 )时,迭代器可能还会执行两次“++”,如果是这样那么it就到达了 ShipList.end() + 1 的位置,这样也会报错。
erase( itList++) 是先获取下一个元素的位置再删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
我认为,erase(itList++)是itList先传递值给erase(),然后再自增;
erase(++itList) 是先自增,然后再把自增后的值传递给erase(),这个是出错的根源。
发表评论
-
C++内存管理
2011-09-19 10:45 8121 内存管理 伟大的Bill G ... -
调试程序
2011-09-14 16:21 739******************************* ... -
有用的网址
2011-08-04 12:44 630http://searchdns.netcraft.com/ -
vim高级应用
2011-08-04 10:29 1009命令模式: “s”为表 ... -
c/c++ 调试
2011-06-08 15:31 840readelf -s a.out 可以查看符号表,就能找到对应 ... -
网站列表
2011-02-25 09:48 692http://www.rosoo.net/ NO ... -
高性能服务器注意事项
2011-01-18 13:09 841对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或 ... -
在 Linux 平台中调试 C/C++ 内存泄漏方法
2010-10-20 15:56 921由于 C 和 C++ 程序中完全由程序员自主申请和释放内存 ... -
用socket编写C/S结构程序的流程图
2010-10-08 17:07 24661.面向连接的套接字的系统调用时序图 无连接协议的套接字调用 ... -
将文件读入内存
2010-09-14 17:35 1113将文本文件读入内存。需要用到fseek、fread和ftell ... -
50 c/c++ 源码网站
2010-08-03 15:47 7931、http://snippets.dzone.com/tag ... -
值得注意的函数
2010-08-03 13:48 558函数 严重性 解决 ... -
调用系统命令
2010-08-02 12:52 646int get_system_info(char* cmdst ... -
结构体对齐
2010-07-30 13:59 13281,比如: struct{ short a1; sh ... -
LINUX c++线程池框架
2010-07-15 11:25 1418本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进 ... -
一个简单的linux线程池
2010-07-12 18:10 983线程池:简单地说,线程池 就是预先创建好一批线程,方便、快速 ... -
文件字符串处理
2010-06-30 09:12 705#include <iostream> #incl ... -
不能用类成员函数作为线程函数
2010-06-29 17:12 868不能用类成员函数作为线程函数 -
c++ 字符串替换
2010-06-24 10:43 995#include <string> #incl ...
相关推荐
本篇文章主要探讨的是在使用STL list时遇到的遍历删除元素过程中常见的错误及其解决方案。 错误用法通常出现在尝试同时遍历和删除list中的元素时。以下是三种常见的错误做法: 1. 错误用法一: 在这个例子中,迭代...
STL Set 容器详细使用方法 STL(Standard Template Library)中的 Set 容器是一种关联容器,用于存储唯一的元素,且自动排序。下面是 STL Set 容器的详细使用方法。 元素类型 Set 容器中元素的类型可以是任何类型...
学习`vector`容器时,还需要理解其与其他STL容器如`deque`、`list`和`array`的区别,以便在不同的场景下选择最合适的容器。例如,`deque`在两端插入和删除更高效,`list`则适合频繁的插入和删除,而`array`是固定...
在这个“STL中容器算法使用说明大全”中,我们将深入探讨几个核心的STL容器,如vector、Map和set,以及相关的算法。 1. **STL容器**: - **vector**:动态数组,提供高效随机访问,支持在末尾快速插入和删除元素。...
### C++ STL之set容器使用方法 #### 一、引言 在C++标准模板库(STL)中,`set`容器是一种非常重要的关联容器,主要用于存储唯一元素,并且这些元素会根据其键值自动排序。`set`内部通常采用红黑树(一种自平衡的二叉...
在使用STL容器时,我们可以使用迭代器来遍历容器中的元素。迭代器是一种特殊的指针,它可以指向容器中的元素,并提供了丰富的操作方法来访问和操作容器中的元素。 在STL容器中,我们可以使用算法来对容器中的元素...
在VC6.0中使用deque,需要包含`<deque>`头文件,并确保编译选项设置正确,启用STL支持。下面是一个简单的例子: ```cpp #include #include int main() { std::deque<int> myDeque; // 添加元素 myDeque.push...
本节将深入探讨STL容器的设计与使用,包括其基本概念、类型、操作以及在实际编程中的应用。 一、STL容器概述 STL容器是一种对象,它们可以存储、管理和操作其他对象。STL提供了多种不同类型的容器,如向量(vector...
与另一种常见的STL容器向量(vector)相比,list的主要特点在于它的操作特性。 1. 插入和删除效率高:由于list的元素不是连续存储的,所以在任何位置插入或删除元素时,只需要修改相邻元素的指针即可,时间复杂度为...
STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。在STL中,容器是一类能够...通过学习这些代码,你可以更好地理解STL容器的API和实际操作方式。
在C++编程中,STL(Standard Template Library,标准模板库)是不可或缺的一部分,它提供了一组高效、灵活且可重用的容器、迭代器、算法和函数对象。本项目"使用STL写的学生管理系统"旨在利用STL的VECTOR和LIST容器...
在复杂的程序中,尤其是当涉及到STL容器时,有效地查看和理解这些容器的状态是调试的关键。本文将详细介绍如何使用GDB来查看STL容器,并特别关注一个名为"gdbinit"的脚本,它能够帮助我们封装这些命令,提高调试效率...
“STL中文手册 doc文档”很可能会详细解释这些组件的使用方法、操作步骤、注意事项以及常见问题的解决策略。它将涵盖如何声明和实例化容器,如何使用迭代器遍历和修改元素,如何应用各种算法,以及如何自定义函数...
在这个话题中,我们将深入探讨STL容器中的`multiset`,并结合VC6.0环境下的代码示例进行讲解。 **一、STL multiset简介** `multiset`是STL中的一种关联容器,它类似于`set`,但允许插入重复元素。`multiset`内部...
使用STL容器时,开发者可以根据实际需求选择最适合的容器。例如,如果需要高效随机访问,vector可能是最佳选择;如果需要高效插入和删除操作,list更适合;如果需要自动排序且键是唯一的,set或map则是理想选择。 ...
本实例将详细讲解STL中常见的容器和算法的使用方法,帮助初学者深入理解并掌握STL的强大功能。 首先,我们来看STL中的容器: 1. **Map**: Map是一种关联容器,它按照键值(key)进行排序,并存储键值对(key-value...
### STL容器和算法函数表详解 #### 一、Vector类的主要成员 `vector<T>`是C++标准模板库(STL)中的动态数组实现,能够自动调整其大小,提供了高效的随机访问能力,是C++中最常用的数据结构之一。 ##### 容器属性 -...
在这个"stl容器.zip"压缩包中,包含了一个名为"stl容器.sln"的解决方案文件,很可能是一个C++项目,用于学习和实践STL容器的使用。 STL容器主要分为四大类:顺序容器、关联容器、容器适配器以及迭代器。接下来我们...
通过实例,我们可以更清晰地了解如何使用STL容器。例如,创建一个vector存储整数,然后使用sort算法对其进行排序;使用map存储字符串和对应的值,通过迭代器遍历并打印所有键值对。 总结,C++ STL容器是强大且灵活...
标准模板库STL的使用实验报告 在本实验报告中,我们将...通过本实验报告,我们学习了STL的使用,包括STL中的容器和算法,以及如何使用STL来解决实际问题。我们也了解了STL的优点,例如提高编程效率、降低编程难度等。