前言:
此刻你们对“迭代器本质上是指针吗”可能比较注重,小伙伴们都想要剖析一些“迭代器本质上是指针吗”的相关知识。那么小编同时在网摘上收集了一些关于“迭代器本质上是指针吗””的相关文章,希望大家能喜欢,大家一起来学习一下吧!C++ 迭代器是一种使程序能够遍历访问容器(如 vector、list、set、map 等)中元素的方法。它允许我们使用相同的语法来遍历不同的容器,使得代码具有更高的可复用性和可维护性。在 C++ STL 中,迭代器是一种通用的工具,可以用来访问所有容器类型的元素,因此也成为了 STL 算法的基石。
迭代器本质上是一种指针,它指向容器中的元素。通过迭代器,我们可以访问容器中的元素,读取或修改它们的值。迭代器可以看作是容器和算法之间的桥梁,将容器和算法解耦,让它们可以相互独立地演化。迭代器使得容器的实现细节对外部透明,用户只需要关心迭代器提供的操作接口即可。
迭代器的常见用法遍历容器元素
std::vector<int> vec = {1, 2, 3, 4, 5};for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " ";}在容器中查找元素
std::vector<int> vec = {1, 2, 3, 4, 5};auto it = std::find(vec.begin(), vec.end(), 3);if (it != vec.end()) { std::cout << "Found element 3 at index " << std::distance(vec.begin(), it) << std::endl;}插入或删除元素
std::vector<int> vec = {1, 2, 3, 4, 5};auto it = vec.begin() + 2; // 指向元素3的迭代器it = vec.insert(it, 6); // 在元素3之前插入元素6,并返回指向新插入元素的迭代器it = vec.erase(it); // 删除元素6,并返回指向下一个元素的迭代器迭代器的操作
迭代器作为访问容器元素的一种方式,支持多种操作来方便地访问和修改容器中的元素。
下面列出了迭代器的常见操作:
解引用操作(*、->):可以通过迭代器对元素进行读写操作。例如,对于一个指向 vector<int> 中第一个元素的迭代器 iter,可以通过 *iter 来访问该元素的值,通过 iter-> 运算符来访问该元素的成员。前缀/后缀自增/自减运算符(++、--):通过这些运算符可以将迭代器向前或向后移动。例如,iter++ 表示将迭代器 iter 向后移动一个位置,而 ++iter 表示将迭代器向前移动一个位置。算术运算符(+、-、+=、-=):通过这些运算符可以实现迭代器的加减操作。例如,iter+n 表示将迭代器 iter 向后移动 n 个位置,而 iter-n 表示将迭代器向前移动 n 个位置。比较运算符(==、!=、<、>、<=、>=):通过这些运算符可以比较两个迭代器的相对位置。例如,iter1 == iter2 表示两个迭代器指向同一个元素,而 iter1 < iter2 表示 iter1 在 iter2 之前。distance 函数:可以通过该函数计算两个迭代器之间的距离,即它们相差的元素个数。例如,distance(iter1, iter2) 返回迭代器 iter1 到 iter2 之间元素的个数。advance 函数:可以通过该函数将迭代器向前或向后移动指定的距离。例如,advance(iter, n) 表示将迭代器 iter 向后移动 n 个位置,而 advance(iter, -n) 表示将迭代器向前移动 n 个位置。迭代器交换(swap):可以通过该函数交换两个迭代器的值。例如,swap(iter1, iter2) 表示交换迭代器 iter1 和 iter2 的值。
int main() { std::vector<int> v{1, 2, 3, 4, 5}; // 使用迭代器遍历vector,并输出所有元素 std::cout << "遍历vector并输出所有元素:"; for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // 修改迭代器所指向的元素 std::cout << "修改迭代器所指向的元素:"; std::vector<int>::iterator it = v.begin(); *it = 10; std::cout << *it << " "; std::cout << std::endl; // 插入元素并返回插入元素的迭代器 std::cout << "在vector的开头插入一个元素:"; std::vector<int>::iterator it_insert = v.insert(v.begin(), 0); std::cout << *it_insert << " "; std::cout << std::endl; // 删除迭代器所指向的元素 std::cout << "删除迭代器所指向的元素:"; std::vector<int>::iterator it_erase = v.erase(v.begin() + 2); std::cout << *it_erase << " "; std::cout << std::endl; // 查找元素并返回指向该元素的迭代器 std::cout << "查找元素并返回指向该元素的迭代器:"; std::vector<int>::iterator it_find = std::find(v.begin(), v.end(), 4); std::cout << *it_find << " "; std::cout << std::endl; return 0;}迭代器的失效
在使用迭代器时,需要注意迭代器的失效问题。当容器在插入、删除元素时,会导致迭代器失效,即该迭代器所指向的元素不再存在或者已经发生变化。如果继续使用失效的迭代器,可能会引发程序崩溃或者产生不可预期的错误结果。
以下 vector 容器的迭代器失效规则:
对于 vector,如果在中间插入或删除元素,则该位置后的迭代器全部失效;如果在尾部插入或删除元素,则尾部迭代器失效。
下面是Vector 插入删除的迭代器解决方法:
添加或者删除时,需要更新迭代器
int main() { std::vector<int> vec{ 1, 2, 3, 4, 5, 6 }; // 遍历 vector,同时添加元素 for (auto it = vec.begin(); it != vec.end();) { std::cout << *it << " "; if (*it == 3) { // 更新迭代器 it = vec.insert(it, 6); // 在 3 的前面插入 6 it+=2; // 移动迭代器,跳过插入的元素 } else { it++; } } std::cout << std::endl; for (auto i : vec) { std::cout << i << " "; } std::cout << std::endl; auto iter = vec.begin(); while (iter != vec.end()) { if (*iter % 2 == 0) { // 更新迭代器 iter = vec.erase(iter); // 删除偶数元素 } else { ++iter; } } for (auto i : vec) { std::cout << i << " "; } std::cout << std::endl; return 0;}
标签: #迭代器本质上是指针吗