const_iterator 和 const iterator
const使用无非两种,指向的不能变,本身不能变。
const_iterator即指向的是一个常量元素;
const iterator即本身是个常量,不能++、–;
vector<int> ivec(10);
const vector<int> civec(10);
vector<int>::iterator iter1 = ivec.begin(); //true
vector<int>::iterator iter2 = civec.begin(); //false
vector<int>::const_iterator iter3 = ivec.begin(); //true
vector<int>::const_iterator iter4 = civec.begin(); //true
civec里面每个元素都是const,都不能改变,因此只能用const_iterator。
const vector<int>::iterator &it = ivec.begin();
*it = 1; //true
此时it本身是const,它指向ivec.begin()而不能改变,因此不能++、–;但可以改变所指向位置的元素,所以*it = 1是正确的。
没有以下写法:
for(auto &it = ivec.begin(); it != ivec.end(); ++it) {...} //false
for(const auto &it = ivec.begin(); it != ivec.end(); ++it) {...} //false
ivec.begin()实际上返回的是一个右值的临时变量,非常量引用不能绑定到临时变量,故错误。
第二种绑定到了常量,即const auto &it = ivec.begin()没错,但是不能对it进行自增操作,因此也错误。
正确写法:
for(auto it = ivec.begin(); it != ivec.end(); ++it) {...} //true
//只是打印可以范围for语句
for(const auto &it : ivec) cout << it << " ";