博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ STL中的 iterator 和 const_iterator
阅读量:5093 次
发布时间:2019-06-13

本文共 1232 字,大约阅读时间需要 4 分钟。

我们在C++中使用STL的容器时,经常会用到迭代器。使用迭代器可以很方便的进行容器元素遍历和修改等操作。

近日,在使用Visual Studio 2015编程的时候发现,set的迭代器直接就是const_iterator类型,而vector的迭代器则是普通的iterator类型,这是为什么呢?今天就和大家一起来探究一下。

Set/Map类型

1 set
::iterator it1;2 map
::iterator it2;3 it1 = set1.begin();4 *it1 = 1;

在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。

1 for (set
::iterator i = IntSet.begin(); i != IntSet.end(); i++) 2 { 3 int &item1 = const_cast
(*i); 4 //do something here 5 }

但是,我还是不建议这么做,虽然这样可以使用迭代器进行修改元素的操作,但这与本身设计出来的思想相违背。

 

转载于:https://www.cnblogs.com/saintlas/p/5840190.html

你可能感兴趣的文章
win10系统的快捷键
查看>>
P1268 树的重量
查看>>
《我们不一样团队》项目需求分析改进
查看>>
软件构造 第三章第三节 抽象数据型(ADT)
查看>>
[Lintcode]118. Distinct Subsequences/[Leetcode]115. Distinct Subsequences
查看>>
java List的初始化
查看>>
Longest Palindromic Substring
查看>>
linux导出Mysql数据sql脚本
查看>>
循环神经网络(3)
查看>>
Jmeter自动化测试-----接口测试基本使用实例
查看>>
智力测试
查看>>
Linux修行学习,网站持更
查看>>
C语言实现链表
查看>>
css选择器权值
查看>>
在Openstack上创建并访问Kubernetes集群
查看>>
Java语言基础41-44--泛型与集合
查看>>
jQuery.callbacks 注释
查看>>
将object类型转换成时间,如果能转的话。
查看>>
软件开发文档范例 分类: 软件工程 2015-03-...
查看>>
vue项目实现记住密码功能
查看>>