文章目录
vector与迭代器简析
迭代器(iterator)可以用迭代访问标准库容器和string中的元素,这篇文章先介绍迭代器与vector的相关操作,其实迭代器的原理都差不多,后面遇到别的用法我们会再做具体介绍。
先写一个简单的例子:
// 创建一个字符串类型的vector数组,并直接赋值
vector<string> str_vec{ "hello", "hi" ,"okay"};
vector<string>::iterator it; //声明迭代器 it
it = str_vec.begin() + 1; // 获取str_vec数组第2个元素引用
cout << (*it).size() << endl; // 第2个元素为"ok",输出"2"
迭代器不仅可以用来访问元素,还可以用来更改元素,注意for循环中的写法;
写法 1
vector<string> str_vec{ "UHAO", "blog" };
vector<string>::iterator it; //声明迭代器 it
// 在每个元素后面加上"new"
for (it = str_vec.begin(); it != str_vec.end(); ++it) {
*it += "new";
}
// 遍历输出
for (it = str_vec.begin(); it != str_vec.end(); ++it) {
cout << *it << endl;
}
写法 2
vector<string> str_vec{ "UHAO", "blog" };
for (auto it = str_vec.begin(); it != str_vec.end(); ++it) {
*it += "new"; // 在每个元素后面加上"new"
}
for (auto& new_it : str_vec) {
cout << new_it << endl;
}
/*
输出结果为:
UHAOnew
blognew
*/
写法解析:
1. for (auto& new_it : str_vec)
是 C++11 引入的范围基于的 for 循环(也称为范围 for 循环),用于遍历容器中的所有元素。在这个语句中:
2. auto
关键字是自动类型推断,它让编译器根据初始化表达式自动推断变量的类型。在这种情况下,编译器会推断出 new_it
的类型应该是 string&
,因为 str_vec
是一个 string
类型的向量。
3. &
表示 new_it
是对 str_vec
中元素的引用,而不是元素的副本。这意味着在循环中对 new_it
所做的任何修改都会直接影响 str_vec
中的元素。如果不使用引用(比如使用 auto new_it
而不是 auto& new_it
),那么 new_it将会是
str_vec中元素的副本,修改
new_it 将不会影响原始向量。 4. 
new_it 是循环变量的名称,在循环体内部用于访问当前迭代到的向量元素。 5. 
str_vec` 是要遍历的向量。
注意
vector<string> str_vec{ "UHAO", "blog" };
for (auto it = str_vec.begin(); it != str_vec.end(); ++it) {
cout << *it.size() << endl; // 错误写法
/*
正确写法:
cout << it->size() << endl;
cout << (*it).size() << endl;
输出:
4
4
*/
}
分析上述代码:
如果我们要获取字符串数组中每个元素的长度,直接写*it.size()
是无法获取的,在 cout << *it.size();
这行代码中,成员访问操作符 .
应用在了迭代器 it
上,但实际上应该先对迭代器进行**解引用**,然后再访问其成员函数 size()
。正确的做法应该是 (*it).size()
或者使用箭头操作符 it->size()
,其他大部分操作都一样的。