码迷,mamicode.com
首页 > 其他好文 > 详细

const 迭代器和 const_iterator (vector/set)

时间:2017-12-09 14:09:39      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:logs   ++   作用   cout   begin   类型   图片   src   复合   

vector:

如同一般复合类型一样,vector 迭代器也可以声明成:

const vector<int>::iterator it1 = v.begin();
vector<int>::iterator const it2 = v.begin();

但在一般复合类型中 it1 通常是底层 const,ti2是 顶层 const。但在上面两条声明语句中 it1, it2 都是顶层 const,即 it1, it2 本身的值不能改变(不能指向其它对象),而其所指对象的值是可以改变的。既然不能通过声明迭代器 it1 的形式得到底层 const,那么就需要有其它方法来达成咯。这就是 const_iterator。

vector<int>::const_iterator it3 = v.begin();

it3 会是一个底层 const,即其所指对象可以改变,但不能改变其所指对象的值。

 1     std::vector<int> v(10, 1);
 2     const vector<int>::iterator it1 = v.begin();
 3     // it1++;//改变it1的值是非法的
 4     *it1 += 1;
 5     cout << *it1 << endl;//输出2
 6 
 7     vector<int>::iterator const it2 = v.begin();
 8     // it2 = v.end();//改变it2的值是非法的
 9     cout << *it2 << endl;//输出2
10     *it2 += 1;
11     cout << *it2 << endl;//输出3
12 
13     vector<int>::const_iterator it3 = v.begin();
14     // *it3 += 1;//改变it3所指对象的值是非法的
15     it3++;//让it3指向v中第一个元素的下一个元素
16     cout << *it3 << endl;//输出1
17 
18     const vector<int>::const_iterator it4 = v.begin();
19     // it4++;//改变it4的值是非法的
20     // *it4 += 1;//改变it4所指对象的值是非法的
21 
22     vector<int>::const_iterator const it5 = v.begin();
23     // it5++;//改变it5的值是非法的
24     // *it5 += 1;//改变it5所指对象的值是非法的

 

set:

1     set<int> s;
2     s.insert(1);
3     s.insert(2);
4     set<int>::iterator it = s.begin();
5     cout << *it << endl;//输出1
6     // *it += 1;//set里面的元素本身是常量,不可改变

在上面的代码中,若加上 it += 1,则会报错:

技术分享图片

可以发现 set 的元素是带有 const 限定符的。

因此要修改 set 里面某个元素的值的话一般需要先删除需要修改的那个元素,再插入目标值,需要 log(n) 的时间。

 

和 vector 迭代器类似的是,const 作用于 set 迭代器也是顶层 const,而 set 又自带底层 const,所以用 const 限定的 set 迭代器既不能改变所指对象,也不能改变所指对象的值。而 const_iterator 的作用则和 set 自带的底层 const 重复了。

 1     set<int> s;
 2     s.insert(1);
 3     s.insert(10);
 4     s.insert(100);
 5 
 6     const set<int>::iterator it1 = s.begin();
 7     cout << *it1 << endl;//输出1
 8     // it1++;//非法操作
 9     // *it1 += 1;//非法操作
10 
11     set<int>::iterator const it2 = s.begin();
12     cout << *it2 << endl;//输出1
13     // it2++;//非法操作
14     // *it2 += 1;//非法操作
15 
16     set<int>::const_iterator it3 = s.begin();
17     // *it3 += 1;//非法操作
18     it3++;
19     cout << *it3 << endl;//输出10

 

const 迭代器和 const_iterator (vector/set)

标签:logs   ++   作用   cout   begin   类型   图片   src   复合   

原文地址:http://www.cnblogs.com/geloutingyu/p/8010993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!