迭代器就是一种访问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 str("123456");
1、for循环遍历
for(int i = 0; i < str.size(); i++){cout << str[i] << " ";
}
2、迭代器遍历
string::iterator it = str.begin();
while (it != d()){cout << *it << " ";it++;
}
3、范围for遍历(内部实现也是使用迭代器)
for(const auto& ch : str){cout << ch << " ";
}
1、增容时失效
void test(){string str("123456");string::iterator it = str.begin();serve(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();ase(0, 1);
}
这段代码中,迭代器一开始指向是字符串的首元素,然后调用erase() 接口将首元素删除,此时原本第二个元素到了首元素的位置,这种情况下,迭代器也会失效;
P.S. 总结来说,当我们使用迭代器,同时又要对对象内容或者容量进行修改时,再修改结束后一定要更新迭代器以确保迭代器不会失效。
本文发布于:2024-02-02 09:21:22,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170683688142842.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |