总结:
begin();end()
正序迭代器cbegin();cend()
返回const
的begin();end()
rbegin();rend()
逆序迭代器crbegin();crend()
返回const
的rbegin();rend()
1、迭代器 begin(), cbegin()
begin();end()
分别返回指向容器头的迭代器、指向容器尾的迭代器,以std::vector
为例
int main ()
{
std::vector<int> vec{1,2,3,4,5};
for (std::vector<int>::iterator iter=vec.begin(); iter!=vec.end(); ++iter){
std::cout << "old element:" << *iter; // 打印元素
(*iter) += 1; // 通过迭代器修改对应元素
std::cout << ", new:" << *iter << std::endl;
}
}
打印结果:
old element:1, new:2
old element:2, new:3
old element:3, new:4
old element:4, new:5
old element:5, new:6
cbegin();cend()
分别返回const
类型的指向容器头的迭代器、指向容器尾的迭代器。- 以
std::vector
为例,返回迭代器类型为std::vector<type_>::const_iterator
int main ()
{
std::vector<int> vec{1,2,3,4,5};
for (std::vector<int>::const_iterator iter=vec.cbegin(); iter!=vec.cend(); ++iter){
std::cout << "element:" << *iter << std::endl;
}
}
打印结果:
element:1
element:2
element:3
element:4
element:5
2、反向迭代器 rbegin(), rend()
rbegin(); rend()
返回逆序迭代器。crbegin(); crend()
返回const
修饰的逆序迭代器。
std::vector<int> vec;
vec.rbegin() // 返回一个逆序迭代器,它指向容器vec的最后一个元素
vec.rend() // 返回一个逆序迭代器,它指向容器vec的第一个元素前面的位置
vec.crbegin() // 返回一个逆序迭代器-const,它指向容器vec的最后一个元素
vec.crend() // 返回一个逆序迭代器-const,它指向容器vec的第一个元素前面的位置
- 如果容器是
const
的,则其返回类型要加上const_
前缀,也就是const_iterator
和const_reverse_iterator
类型。
- 反向迭代器是一种反向遍历容器的迭代器。通过对
++
和--
运算符进行重载,使得: - 对于反向迭代器,
++
运算将访问前一个元素,--
运算则访问下一个元素。
例1-逆序打印:
int main() {
std::vector<int> vec{0,1,2,3,4,5,6,7,8,9};
vector<int>::reverse_iterator r_iter;
for (r_iter = vec.rbegin(); // 迭代器指向最后一个元素
r_iter != vec.rend(); // rend() 指向第一个元素的前一个
++r_iter) // ++操作访问前一个元素
std::cout << *r_iter << " "; // prints 9,8,7,...0
std::cout << "\n";
return 0;
}
打印结果:9 8 7 6 5 4 3 2 1 0
- 为了以降序排列容器中元素,需向
std::sort
传递一对反向迭代器:
例1-降序排列:
int main() {
std::vector<int> vec{1,2,3,0,5};
// sorts vec in "normal" order, 0 1 2 3 5
std::sort(vec.begin(), vec.end());
std::cout << "正序排列: ";
for (auto& i:vec)
std::cout << i << " ";
// sorts in reverse: puts smallest element at the end of vec, 5 3 2 1 0
std::sort(vec.rbegin(), vec.rend());
std::cout << "\n逆序排列: ";
for (auto& i:vec)
std::cout << i << " ";
return 0;
}
正序排列: 0 1 2 3 5
逆序排列: 5 3 2 1 0