企业案例网站生成,没有网站想做个链接页面怎么做,网络推广的方式有哪些,wordpress正在建设中一、定义 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。 【引用自#xff1a;C迭代器#xff08;iterator#xff09;_c iterator_NiUoW的博客-CSDN博客】迭代器是一个变量#xff0c;相当于容器和操纵容器的算法之间的中介。C更趋向于使用迭代器而不是数组下…一、定义 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。 【引用自C迭代器iterator_c iterator_NiUoW的博客-CSDN博客】迭代器是一个变量相当于容器和操纵容器的算法之间的中介。C更趋向于使用迭代器而不是数组下标操作因为标准库为每一种标准容器如vector、map和list等定义了一种迭代器类型而只有少数容器如vector支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址通过*x打印出元素值。这和我们所熟知的指针极其类似。 C语言有指针指针用起来十分灵活高效。C语言有迭代器迭代器相对于指针而言功能更为丰富。 vector是数组实现的也就是说只要知道数组的首地址就能访问到后面的元素。所以我们可以通过访问vector的迭代器来遍历vector容器元素。 List是链表实现的我们知道链表的元素都存储在一段不是连续的地址空间中。我们需要通过next指针来访问下一个元素。那么我们也可以通过访问list的迭代器来实现遍历list容器元素。 由此可见迭代器和容器是密不可分的、紧密相连的的关系。不同的容器它们的迭代器也是不同的但是它们的迭代器功能是一样的。假如没有迭代器由于vector和list容器的存储特点你需要两种算法去实现遍历vector和list容器的功能复杂且低效。有了迭代器遍历容器的效率会大大提高。
二、为什么要使用迭代器 使用STLStandard Template Library中的迭代器有以下几个好处
1. 统一的访问方式STL的迭代器提供了一种统一的访问容器元素的方式无论是数组、链表、集合还是映射都可以通过相同的迭代器接口进行遍历和访问。这种统一性简化了代码的书写并提高了代码的可读性和可维护性。
2. 安全的访问操作迭代器在设计上考虑了容器的边界情况确保不会越界访问或访问非法内存引起崩溃。迭代器提供了递增、递减等操作符使得在容器中前进或后退一个位置变得简单和安全。
3. 灵活的遍历方式迭代器支持正向遍历、反向遍历以及跳跃式遍历等方式使得在不同的情况下选择合适的遍历方式变得方便。比如可以使用反向迭代器从容器的末尾向前遍历或者使用跳跃式迭代器按照一定规则跳过一些元素。
4. 可算法化处理STL提供了丰富的算法如排序、查找、拷贝、删除等这些算法可以直接操作迭代器而不需要关心具体容器的实现。使用迭代器作为算法的参数使得代码可复用性更强可以将同一套算法应用于不同类型的容器。
5. 可组合的操作迭代器的操作是可以组合的可以在不同的操作之间进行链式调用形成更复杂的操作序列。这种可组合性使得代码更加灵活可以根据需求自由组合和定制迭代器操作实现更多样化的功能。 总之STL中的迭代器提供了一种抽象的、统一的访问容器元素的方式使得我们可以以一种通用的方式处理各种不同类型的容器。这样做可以提高代码的重用性、可读性和可维护性同时还能够充分利用STL提供的丰富算法简化开发过程并提高效率。
另一种解释【取自CSTL之迭代器iterator详解_c迭代器-CSDN博客】
(1) STL提供每种容器的实现原理各不相同如果没有迭代器我们需要记住每一种容器中对象的访问方法很显然这样会变得非常麻烦。
(2) 每个容器中都实现了一个迭代器用于对容器中对象的访问虽然每个容器中的迭代器的实现方式不一样但是对于用户来说操作方法是一致的也就说通过迭代器统一了对所有容器的访问方式。
(3) 迭代器的使用可以提高编程的效率。
三、迭代器的使用
3.1 基本使用方法
(1) 首先要定义一个迭代器类型变量这里以vector容器为例。 定义方法如下容器类名::iterator 迭代器名; 如要定义vector容器的迭代器vectorint::iterator iter;(这里的iter是变量名可以自定义)(2) 接下来要利用迭代器访问容器数据 先要了解几个成员函数如下表所示。
成员函数功能begin()返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器在该函数返回的是常量正向选代器。end()返回指向容器最后一个元素之后一个位置的正向迭代器如果是 onst 类型容器在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配使用。rbegin()返回指向最后一个元素的反向迭代器如果是 const 类型容器在该函数返回的是常量反向迭代器。rend()返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器在该函数返回的是常量反向迭代器。此函数通常和 begin() 搭配使甲。
这里的 end()、rend() 函数要注意不是指向容器最后一个元素而是后一个位置看图 (3) 示例
#includeiostream
#includevectorint main() {std::vector int vec; // 定义向量对象vecvec.push_back(2);vec.push_back(3);vec.push_back(5);vec.push_back(9);// 至此向量vec中包含四个元素分别是2359std::vectorint::iterator iter; // 定义迭代器类型变量iteriter vec.begin(); // 变量被赋值为指向第一个元素的迭代器std::cout *iter std::endl;iter; // 可以用自增操作让iter指向下一个元素std::cout *iter std::endl;iter vec.begin() 2; // 让iter指向容器中的第三个位置std::cout *iter std::endl;
}
输出结果 2 3 5
注意vector容器迭代器属于随机访问迭代器可以一次移动多个位置如iterv1.begin()2; 也可以用iteriter2;
3.2 容器数据的遍历
3.2.1 常见方法正序遍历
for (auto it container.begin(); it ! container.end(); it) {// process element *it
}3.2.2 常见方法逆序遍历
for (auto it container.rbegin(); it ! container.rend(); it) {// process element *it
}其中auto是C11的关键字它可以自动推导迭代器类型。循环中首先使用begin()函数获取容器起始位置的迭代器然后每次使用递增运算符前进一个位置直到迭代器等于end()函数返回的迭代器时结束循环。
3.2.3 注意问题 需要注意的是在处理空容器或只有一个元素的容器时begin()和end()函数返回的迭代器是相同的因此在循环中不能使用!运算符进行比较而应该使用 或 运算符判断是否越界。 当一个容器为空或只有一个元素时begin()和end()函数返回的迭代器是同一个位置因此使用!运算符进行比较可能会得到错误的结果。 对于空容器begin()和end()函数都返回指向末尾的迭代器因为没有元素可以遍历。这种情况下应该直接判断迭代器是否等于末尾迭代器如下所示
std::vectorint v;
if (v.begin() v.end()) {// 处理空容器的情况
} 对于只有一个元素的容器begin()和end()函数虽然会返回不同的迭代器但是它们指向的是同一个位置即容器中唯一的元素。这种情况下应该使用或运算符进行比较如下所示
std::vectorint v{1};
for (auto it v.begin(); it v.end(); it) { // 注意这里使用std::cout *it std::endl;
}同样地在循环中也可以使用或运算符判断是否越界但是更好的做法是使用标准库提供的迭代器判等函数std::equal()、std::lexicographical_compare()等这些函数会自动处理空容器和只有一个元素的容器的情况并提供更好的可读性和代码健壮性。
3.2.4 遍历应用示例
#includeiostream
#includevectorint main() {std::vector int vec; // 定义向量对象vecvec.push_back(2);vec.push_back(3);vec.push_back(5);vec.push_back(9);// 至此向量vec中包含四个元素分别是2359// 遍历向量vec中的所有元素for (auto iter vec.begin(); iter ! vec.end(); iter) {std::cout *iter ;}std:: cout std::endl;
}
注意上面说到end()函数是指向容器的最后一个元素的后一个位置所以当迭代器指向最后的后一个位置时结束遍历便可以访问所有容器元素。
输出结果
2 3 5 9
四、不同容器的迭代器(iterator)的功能
vector 随机访问 deque 随机访问 list 双向 set / multiset 双向 map / multimap 双向 stack 不支持迭代器 queue 不支持迭代器 priority_queue 不支持迭代器
参考文献
CSTL之迭代器iterator详解_c迭代器-CSDN博客C迭代器iterator_c iterator_NiUoW的博客-CSDN博客关于迭代器失效的几种情况-CSDN博客值得阅读