龙空技术网

C++ 迭代器

睿智的海边风浪 470

前言:

此刻你们对“迭代器本质上是指针吗”可能比较注重,小伙伴们都想要剖析一些“迭代器本质上是指针吗”的相关知识。那么小编同时在网摘上收集了一些关于“迭代器本质上是指针吗””的相关文章,希望大家能喜欢,大家一起来学习一下吧!

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;}

标签: #迭代器本质上是指针吗