const迭代器和const_iterator(vectorsetmap)
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);
2const 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
18const 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:
1set<int> s;
2 s.insert(1);
3 s.insert(2);
4set<int>::iterator it = s.begin();
5 cout << *it << endl;//输出1
6// *it += 1;//set⾥⾯的元素本⾝是常量,不可改变
在上⾯的代码中,若加上 it += 1,则会报错:
可以发现 set 的元素是带有 const 限定符的。
因此要修改 set ⾥⾯某个元素的值的话⼀般需要先删除需要修改的那个元素,再插⼊⽬标值,需要 log(n) 的时间。
当然也可以通过来解除 set 迭代器的底层 const:
1set<int> s;
2 s.insert(1);
3 s.insert(10);
4 s.insert(100);
5
6const set<int>::iterator it = s.begin();
7int &cnt = const_cast<int&>(*it);//cnt为it所指对象的引⽤, 但cnt不具有底层const
8 cnt += 100;
9 cout << *it << endl;//输出101
10 cout << cnt << endl;//输出101
11for(auto i : s){
12 cout << i << "";//输出 101 10 100 (set类型对象s的有序性被破坏了)
13 }
14 cout << endl;
15
16 s.insert(1);
17 cout << *s.begin() << endl;
18for(auto i : s){const的作用
19 cout << i << "";//输出 1 101 10 100
20 }
21 cout << endl;
上例中虽然⽤ const_cast 去掉了迭代器 it 的底层 const,但是却破坏了 s 的有序性,显然不是⼀个好的办法。因此⽤ const_cast 改变对象的底层 const 时⼀定要慎之⼜慎。
和 vector 迭代器类似的是,const 作⽤于 set 迭代器也是顶层 const,⽽ set ⼜⾃带底层 const,所以⽤ const 限定的 set 迭代器既不能改变所指对象,也不能改变所指对象的值。⽽ const_iterator 的作⽤则和 set 迭代器⾃带的底层 const 重复了。
1set<int> s;
2 s.insert(1);
3 s.insert(10);
4 s.insert(100);
5
6const set<int>::iterator it1 = s.begin();
7 cout << *it1 << endl;//输出1
8// it1++;//⾮法操作
9// *it1 += 1;//⾮法操作
10
11set<int>::iterator const it2 = s.begin();
12 cout << *it2 << endl;//输出1
13// it2++;//⾮法操作
14// *it2 += 1;//⾮法操作
15
16set<int>::const_iterator it3 = s.begin();
17// *it3 += 1;//⾮法操作
18 it3++;
19 cout << *it3 << endl;//输出10
map:
和 set 类似,map 的迭代器也带有底层 const,不同的是 map 迭代器中只有 key 是 const 的。
1 map<int, int> mp;
2 mp[1] = 2;
3 map<int, int>::iterator it = mp.begin();
4 cout << (*it).first << "" << (*it).second << endl;//输出1 2
5 (*it).second += 1;
6// (*it).first += 1;//有const修饰符,不能改变
7 cout << (*it).first << "" << (*it).second << endl;//输出1 3
如果加上 (*it).first += 1; 则会报错:
const 作⽤于 map 也是顶层 const,⽽ const_iterator 作⽤于 map 是底层 const。map 迭代器指向的⼀个 pair 类型的对象。map 迭代器只有key(pair 的第⼀个元素)是 const 的。使⽤ const_iterator 后则整个 pair 都是 const 的。
1 map<int, int> mp;
2 mp[1] = 2;
3 mp[2] = 3;
4
5const map<int, int>::iterator it1 = mp.begin();
6// it1 = mp.end();//⾮法操作
7// it1->first += 1;//⾮法操作
8 it1->second += 1;
9 cout << it1->first << "" << it1->second << endl;//输出1 3
10
11 map<int, int>::iterator const it2 = mp.begin();
12// it2 = mp.end();//⾮法操作
13// it2->first += 1;//⾮法操作
14 it2->second += 1;
15 cout << it2->first << "" << it2->second << endl;//输出1 4
16
17 map<int, int>::const_iterator it3 = mp.begin();
18 it3 = --mp.end();//end是尾后迭代器
19// it3->first += 1;//⾮法操作
20// it3->second += 1;//⾮法操作,使⽤const_iterator修饰后it3具有底层const 21
22const map<int, int>::const_iterator it4 = mp.begin();
23// it4 = --mp.end();//⾮法操作
24// it4->first += 1;//⾮法操作
25// it4->second += 1;//⾮法操作
26
27 map<int, int>::const_iterator const it5 = mp.begin();
28// it5 = --mp.end();//⾮法操作
29// it5->first += 1;//⾮法操作
30// it5->second += 1;//⾮法操作
如果试图给 const_iterator 迭代器改变所指对象的值,则会报错:
提⽰ std::pair<const int, int>::second 是只读的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论