C++——string之迭代器
迭代器iterator
(一)迭代器概念
迭代器就是一种访问string中的各个元素的机制,类似于指针(其底层实现就是指针,同样有解引用、++、- -的操作);
(二)迭代器种类
迭代器总共有四种:正向迭代器(iterator)、反向迭代器(reverse_iterator)、只读迭代器(const_iterator)、只读反向迭代器(const_reverse_iterator);
当我们有针对const修饰的对象时,则必须使用只读迭代器const_iterator
(三)接口
1、begin()、rbegin()、cbegin()、crbegin()
begin():指向容器第一个元素的位置(可读可写)
rbegin():指向容器最后一个元素的位置(可读可写)
cbegin():指向容器第一个元素的位置(只读)
crbegin():指向容器最后一个元素的位置(只读)
2、end()、rend()、cend()、crend()
end():指向容器最后一个元素的下一个位置(可读可写)
rend():指向容器第一个元素的前一个位置(可读可写)
cend():指向容器最后一个元素的下一个位置(只读)
crend():指向容器第一个元素的前一个位置(只读)
(四)遍历string对象的三种方式
string str("123456");
1、for循环遍历
for(int i = 0; i < str.size(); i++){
cout << str[i] << " ";
}
2、迭代器遍历
string::iterator it = str.begin();
while (it != str.end()){
cout << *it << " ";
it++;
}
3、范围for遍历(内部实现也是使用迭代器)
for(const auto& ch : str){
cout << ch << " ";
}
(五)迭代器失效
1、增容时失效
void test(){
string str("123456");
string::iterator it = str.begin();
str.reserve(100);
}
此时经过增容之后,增容的函数内部会实现原有空间的释放的过程,就会导致此时迭代器的指向不再是指向现在的对象,这就导致了迭代器失效,此时必须要重新定义迭代器使其指向现在的对象空间;
同理,调用insert()、push_back()、append()、resize() 等等这些涉及到增容的函数时同样可能会这种问题;
2、缩容时失效
void test(){
string str("123456");
string::iterator it = str.rbegin();
resize(3);
}
上面这段代码中,迭代器先指向最后一个元素,当缩容时,迭代器指向的并不再是有效字符的位置,此时迭代器也失效了;
3、删除时失效
void test(){
string str("123456");
string::iterator it = str.begin();
str.erase(0, 1);
}
这段代码中,迭代器一开始指向是字符串的首元素,然后调用erase() 接口将首元素删除,此时原本第二个元素到了首元素的位置,这种情况下,迭代器也会失效;
P.S. 总结来说,当我们使用迭代器,同时又要对对象内容或者容量进行修改时,再修改结束后一定要更新迭代器以确保迭代器不会失效。
本文地址:https://blog.csdn.net/luzhaoxi/article/details/109600146
下一篇: Java设计模式之结构型模式