当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C++——string之迭代器

C++——string之迭代器

2020年11月12日  | 移动技术网IT编程  | 我要评论
一、string构造void test(){string str1; //默认构造 string str4("123456"); //C风格字符串创建string str5 = "123456"; //单参构造隐式类型转换string str8("12345678", 5); //以字符串前n个字符创建对象,内容为"12345"string str9(10, 'a'); //用n个字符创建对象,内容为10个字符astring str2(

迭代器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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网