c++ string

看看下面的代码:


#include
#include
using namespace std;


void test_string1()
{
	string s1("hello world");
	string s2 = "hello world"; 


	// 遍历 string
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";  
	}

}

int main()
{
	test_string1();


	return 0;
}

c++ string_第1张图片
上面代码是一种遍历的方式,还有一种遍历的方式:迭代器

迭代器是什么?
我们可以把它想象成像指针一样的东西。
迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。

C语言有指针,指针用起来十分灵活高效
C++语言有迭代器,迭代器相对于指针而言功能更为丰富

vector,是数组实现的,也就是说,只要知道数组的首地址,就能访问到后面的元素。所以,我们可以通过访问vector的迭代器来遍历vector容器元素。

来体验一下: 看一下下面的代码:

    string s1("hello world");

	// 迭代器
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

看不懂没关系,看解析:
c++ string_第2张图片

c++ string_第3张图片
下一个:

     string s1("hello world");
	// 反向迭代器——————倒着走
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

c++ string_第4张图片

还有:
范围for
用范围for来遍历s1

// 用范围for来遍历s1
for (auto a : s1)
	{
		cout << a << " ";
	}

c++ string_第5张图片
范围for
容器都可以用。
自动取元素依次赋值给你设的变量。并自动判断结束。自动++
范围for 不支持倒着遍历
上面的代码就是: 遍历s1

思考,那用范围for可以修改s1吗? 我们不妨试一下:

string s1("hello world");
	for (auto a : s1)
	{
		a++;     //试图修改
	}
	cout << endl;  //换行

	for (auto a : s1)
	{
		cout << a << " "; //输出
	}
	cout << endl;   //换行

结果:
在这里插入图片描述
我们发现值并未被修改。

为什么?
这个范围for的自动遍历它是指的什么呢,它是指的将*it (就是你定义的那个迭代器的那个变量)赋值给 a(你在范围for里面定义的那个变量)
这种赋值上就是一种拷贝。意思是:a 就只是*it的一个拷贝。所以你改不了它。
那我们怎样才能改它呀?
既然拷贝改不了,那我们就取别名(用引用的方式)。这样就可以改了。
c++ string_第6张图片

string s1("hello world");
	for (auto &a : s1)
	{
		a++;     //试图修改
	}
	cout << endl;  //换行

	for (auto a : s1)
	{
		cout << a << " ";
	}
	cout << endl;   //换行

c++ string_第7张图片
看结果已经修改了;

==============================================================
下一个知识点:
c++ string_第8张图片
怎么办,迭代器:iteratorconst 版本的 和 非const 版本的。我们换成 const版本的就行了。
c++ string_第9张图片

你可能感兴趣的:(c++)