【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )
一、 使用迭代器遍历 vector 容器步骤1、使用迭代器遍历 vector 容器的步骤2、代码示例 - 使用迭代器遍历 vector 容器二、 iterator 迭代器常用 api 简介1、vector 容器类 begin 函数 - 获取指容器向首元素的迭代器2、vector 容器类 end 函数 - 获取末尾迭代器3、iterator 迭代器类解引用操作 - operator* 重载运算符函数
文章目录
一、 使用迭代器遍历 vector 容器步骤
1、使用迭代器遍历 vector 容器的步骤
使用 迭代器 遍历 vector 容器 ,
首先 , 获取 起始范围 迭代器 , std::vector<int> 类型的容器 , 其迭代器类型是 vector<int>::iterator , 调用 vector 类的 begin() 函数 , 可获取 指向容器中 第一个元素的迭代器 ;
vector<int>::iterator it = vec.begin();
然后 , 获取 迭代器 指向元素的内容 , 使用 * 操作符 , 实际上调用的是 重载 * 运算符函数 ;
*it
再后 , 对 迭代器 进行自增操作 , 自增 ++ 操作实际上调用的是 重载 ++ 运算符函数 , 用于递增迭代器 , 执行完毕后 , 迭代器指向下一个元素 ;
it++
最后 , 判定迭代器 是否迭代到了 容器末尾 , 调用 vector 类的 end() 函数 , 可获取 指向容器中 最后一个元素的迭代器 , 判断当前的迭代器值 是否等于 最后一个元素的迭代器值 , 如果 不等于 继续迭代 , 如果等于 停止迭代 ;
it != vec.end();
2、代码示例 - 使用迭代器遍历 vector 容器
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{1, 2, 3};
// 遍历打印 vector 容器的内容
for (int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << ' ';
}
std::cout << std::endl;
// 通过迭代器遍历数组
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
std::cout << *it << ' ';
}
std::cout << std::endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
1 2 3
1 2 3
Press any key to continue . . .
二、 iterator 迭代器常用 api 简介
1、vector 容器类 begin 函数 - 获取指容器向首元素的迭代器
调用 vector 容器类 begin 函数 , 可以 获取指容器向首元素的迭代器 ;
iterator begin();
const_iterator begin() const;
上述个函数都返回一个 指向容器中 首元素的迭代器 ;
第一个重载版本函数 是 非常量迭代器 , 可以用来修改容器中的元素 ;
第二个重载版本函数 是 常量迭代器 , 不能用来修改容器中的元素 ;
返回的迭代器 可以使用 * 操作符进行解引用操作 , 获取迭代器指向的元素的值 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{1, 2, 3};
// 获取首元素迭代器
vector<int>::iterator it = vec.begin();
// 打印首元素
cout << *it << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
2、vector 容器类 end 函数 - 获取末尾迭代器
调用 vector 容器类的 end 函数 , 可以 获取 末尾迭代器 , 函数原型如下 :
iterator end() const noexcept;
const_iterator end() const noexcept;
上述两个函数都返回一个指向 容器中 最后一个元素 之后一个位置的迭代器 , 返回的迭代器 不指向任何有效的元素 , 但可以被用于比较和遍历容器的末尾 ;
特别注意 : 修改 vector 容器后 , end()
函数返回的迭代器在容器被修改时不会自动更新 ; 如果 vector 容器中的元素发生了改变 , 需要重新调用 end() 函数来获取新的末尾迭代器 ;
代码示例 :
#include "iostream"
using namespace std;
#include "vector"
int main() {
// 创建空的 vector 容器
std::vector<int> vec{1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.end();
// 该迭代器指向 容器中 最后一个元素 之后一个位置
// 下面的代码会造成异常 , 不能获取对应的元素值
cout << *it << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 : 末尾迭代器指向 容器中 最后一个元素 之后一个位置 , 不能进行解引用 , 会造成异常 ;
3、iterator 迭代器类解引用操作 - operator* 重载运算符函数
使用 * 运算符 可以对 iterator 迭代器 对象 进行 解引用操作 , 在 iterator 类中 , 对 * 运算符进行了重载 , 函数原型如下 :
reference operator*() const;
operator*() 函数 会 返回 迭代器所指向的元素的引用 ; 解引用一个迭代器时,会得到它所指向的元素的值 ;
operator* 返回的是元素的引用 , 而不是元素的副本 ; 如果 通过得到的引用 修改了该元素的值 , 那么 vector 容器中的元素也会一并进行修改 ;
特别注意 : operator* 只适用于 非常量迭代器 ;
代码示例 :
// 创建空的 vector 容器
std::vector<int> vec{1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.begin();
// 迭代器解引用
*it;
4、iterator 迭代器自增操作 - operator++ 重载运算符函数
使用 ++ 运算符 可以对 iterator 迭代器 对象 进行 自增操作 , 在 iterator 类中 , 对 ++ 运算符进行了重载 , 函数原型如下 :
// 前置 ++ 自增操作
iterator& operator++();
// 后置 ++ 自增操作
iterator operator++(int);
上述两个函数原型都可以令 iterator 迭代器 对象 进行自增操作 , 使迭代器指向 下一个元素 , 这两个函数 都只能用于 非常量迭代器 ;
-
前置递增操作符 ++ : 返回一个引用到修改后的迭代器本身 , 允许你在一个语句中递增迭代器并使用它 ;
-
后置递增操作符 ++ : 返回一个新的迭代器 , 该迭代器指向下一个元素 , 原来的迭代器保持不变 ; 这个操作符重载了 int 参数,以避免与前置递增操作符的优先级混淆
代码示例 :
// 创建空的 vector 容器
std::vector<int> vec{1, 2, 3};
// 获取末尾迭代器
vector<int>::iterator it = vec.begin();
// 前置递增操作符
it++;
// 后置递增操作符
it++;
更多推荐
所有评论(0)