欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++——string之迭代器

程序员文章站 2022-07-10 18:32:05
一、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

相关标签: C++