C++ STL中的 iterator 和 const_iterator
我们在C++中使用STL的容器时,经常会用到迭代器。使用迭代器可以很方便的进行容器元素遍历和修改等操作。
近日,在使用Visual Studio 2015编程的时候发现,set的迭代器直接就是const_iterator类型,而vector的迭代器则是普通的iterator类型,这是为什么呢?今天就和大家一起来探究一下。
Set/Map类型
set<int>::iterator it1;
map<int,int>::iterator it2;
it1 = set1.begin();
*it1 = ;
在Visual Studio 2010版本以上,声明一个集合或者一个哈希表的迭代器,虽然我们写的是普通的iterator,但是其实它们都是const_iterator,即一个无法对元素进行修改操作的const引用(set取到的iterator则是const的,而map取到的iterator的key则是const的)。因此,如果使用该迭代器对容器中元素进行修改操作则会编译不通过(如第3、4行代码),对于map的迭代器同理。
为什么不允许对元素进行修改?
我认为这其中有两个原因:
① 因为set和map这种类型的容器,需要根据key来保持有序或者是确保元素的唯一性,所以不允许用户直接对元素进行修改。如果允许用户在使用iterator时直接对元素进行修改间接的修改了元素的键值,很有可能导致非唯一性或无序。
② 正是由于这种类型的容器需要保持元素的有序性,底层可能用了某种数据结构来保存(如:堆),如果频繁的修改元素,则内部可能需要多次进行排序,导致效率低下。
怎么对元素进行修改?
既然普通的iterator无法直接对元素进行修改,那么我们应该怎么做呢?下面就给出两种方法。
① 使用容器的erase()和insert()方法。如果想修改某个元素,那么直接删掉它,再将修改过的元素插入到原有的容器中。这种方法的缺点是效率太低。
② 使用const_cast。
我们都知道const_cast可以去掉任何底层const修饰,使得一个const变量成为非const的,这里我们就使用这一点来消除iterator的const。
for (set<int>::iterator i = IntSet.begin(); i != IntSet.end(); i++)
{
int &item1 = const_cast<int&>(*i);
//do something here
}
但是,我还是不建议这么做,虽然这样可以使用迭代器进行修改元素的操作,但这与本身设计出来的思想相违背。
C++ STL中的 iterator 和 const_iterator的更多相关文章
- STL中实现 iterator trail 的编程技巧
STL中实现 iterator trail 的编程技巧 <泛型编程和 STL>笔记及思考. 这篇文章主要记录在 STL 中迭代器设计过程中出现的编程技巧,围绕的 STL 主题为 (迭代器特 ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- (转)STL中set的用法
转载自here 1.关于set map容器是键-值对的集合,好比以人名为键的地址和电话号码.相反地,set容器只是单纯的键的集合.例如,某公司可能定义了一个名为bad_checks的set容器,用于记 ...
- STL中的set容器的一点总结(转)
STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂 ...
- STL中的set使用方法详细!!!!
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- STL中的Vector相关用法
STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...
- STL 中的map 与 hash_map的理解
可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_ma ...
- STL中的set容器的一点总结2
http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像 ...
随机推荐
- [转]你不需要jQuery
完全没有否定jQuery的意思,jQuery是一个神奇的.非常有用的工具,可以节省我们大量的时间. 但是,有些时候,我们只需要jQuery的一个小功能,来完成一个小任务,完全没有必要加载整个jQuer ...
- SQL DELETE 语句
DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 Person: LastName FirstName Address City Gates Bi ...
- Reveal - UI 分析工具
一.安装和简介 a) download url b) Reveal 使用的方法有两种: Static Library Intefration, Dynamic Library Intefration. ...
- SignalR 远程访问并跨域
http://stackoverflow.com/questions/16875228/how-do-i-get-a-signalr-hub-connection-to-work-cross-doma ...
- 【Html 学习笔记】第一节——基础标签
前端技术一直是欠缺,从今天开始以后打算每天抽出一部分的时间进行学习,尽快把这方面补上来.感觉测试人员还是需要一些前端技能的,我这里学习地址是:W3CSchool 废话不多说了,直接在文本编辑器中编辑好 ...
- css控制段落
<p></p>标签:一段话或者段落适宜于用p标签: 段落缩进:text-indent:50px: 文字方向:text-align:center居中.left往左显示.right ...
- Intellij Idea 工具在java文件中如何避免 import .*包
Intellij Idea工具在java文件中怎么避免import java.utils.*这样的导入方式,不推崇导入*这样的做法!Editor->Code Style->Java-> ...
- web app上传图片
很就很久以前,web app上传图片需要通过cordova插件,那时候好像还叫phonegap. 后来一个html标签就可以了 <input type="file" clas ...
- [转]ORACLE函数大全
SQL中的单记录函数 1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ' ...
- understanding-论文
understanding temporal and spatial travel paterns of individual passengers by mining smart card data ...