【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )






一、 使用迭代器遍历 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++;