迭代器常用用法

1. 每一种容器都有自己的迭代器

2. 所有的迭代器接口都是一样

3. 在整个标准器中,经常使用形参为一对迭代器的构造函数 

4. 常用的迭代器操作

*iter(迭代器实际上是一种指针 ++iter --iter iter1==iter2 iter1!=iter2

5. vector和deque容器的迭代器的额外操作(这两种容器实际是数组)

iter+n iter-n > >= < <=

6. 迭代器的范围(//一对迭代器)

begin/end first/last

7. 使迭代器失效的容器操作

在对容器操作时可能

#include<iostream>

#include<vector>

#include<deque>

#include<list>//不仅限于这三种,对所有的容器都适用


using namespace std;

int main()

{

vector<int> a;

deque<int> b;

list<int> c;


a.push_back(1);

a.push_back(2);

a.push_back(3);

a.push_back(4);

a.push_back(5);


vector<int>::iterator iter1=a.begin();//begin指向的是第一个

vector<int>::iterator iter1=a.end();//end指向的是最后一个的下一个,

cout<<*iter1<<endl;//1

iter1++;

cout<<*iter1<<endl;//2

iter1--;//1 

cout<<endl;


vector<int>::iterator first=a.begin();

vector<int>::iterator last=a.begin();

while(first!=last){//因为指向的是最后一个的下一个,所以这样写很舒服

cout<<*first<<endl;

first++

}

vector<int>::iterator x=a.begin();

vector<int>::iterator m=x+a.size()/2;//只有vector和deque可以用这种方法

cout<<"中间"<<*m<<endl;//注意是*m

return 0;

}

<think>嗯,用户想了解C++迭代器的具体使用方法。我得先回忆一下迭代器的基本概念,然后整理出常见的几种类型和使用场景。 首先,迭代器是STL中用来访问容器元素的重要工具,类似于指针。需要解释迭代器的作用,比如遍历容器、访问元素等。可能用户对迭代器的分类不太清楚,比如输入、输出、前向、双向、随机访问迭代器的区别,应该分别举例说明。 接下来,使用步骤应该包括获取迭代器(begin和end)、遍历方法(比如for循环)、元素访问和解引用。要注意提醒用户迭代器的失效问题,比如在修改容器后迭代器可能失效的情况。 然后,针对不同容器,比如vector、list、map,给出具体的例子。比如vector可以用随机访问迭代器,而list是双向迭代器。map的迭代器指向的是pair结构,需要展示如何访问键和值。 另外,算法部分也很重要,比如sort和find如何使用迭代器。需要强调迭代器作为算法和容器之间的桥梁作用。 可能用户会混淆不同的迭代器类型,比如误用双向迭代器进行随机访问,这里需要指出常见错误。此外,const迭代器和反向迭代器使用场景也需要提到。 最后,提醒用户注意迭代器的有效性,比如在插入或删除元素后,迭代器可能失效,特别是在vector和deque中。这部分容易出错,需要举例说明。 整理结构的时候,分点列出概念、使用步骤、类型说明、常用容器示例、与算法结合、注意事项。每个部分给出代码示例,确保语法正确,使用中文注释。保持回答结构清晰,逐步引导用户理解迭代器使用方法。</think>好的!我将分步骤介绍C++迭代器使用方法,帮助您掌握这一重要工具。 一、迭代器核心概念 1. 迭代器作用:提供统一的方式访问容器(如vector/list/map)中的元素 2. 本质:类似于指针的智能对象,支持解引用(*it)和移动(++it)操作 3. 分类(按功能): - 输入/输出迭代器(最基础) - 前向迭代器(如forward_list) - 双向迭代器(如list/map) - 随机访问迭代器(如vector/array) 二、基本使用步骤 ```cpp #include <vector> #include <iostream> int main() { // 1. 创建容器 std::vector<int> vec{1,2,3,4,5}; // 2. 获取迭代器 auto it_begin = vec.begin(); // 指向第一个元素 auto it_end = vec.end(); // 指向末尾的"哨兵"位置 // 3. 遍历容器 for(auto it = vec.begin(); it != vec.end(); ++it) { // 4. 解引用访问元素 std::cout << *it << " "; // 输出:1 2 3 4 5 } // 5. 修改元素 *vec.begin() = 10; // 第一个元素变为10 return 0; } ``` 三、不同容器的迭代器特性 1. vector(随机访问迭代器): ```cpp std::vector<int> v{10,20,30}; auto it = v.begin(); it += 2; // 直接跳转到第三个元素 std::cout << *it; // 输出30 ``` 2. list(双向迭代器): ```cpp std::list<int> lst{5,6,7}; auto it = lst.begin(); ++it; // 允许前移 --it; // 允许回退 // it += 2; // 错误!不支持随机访问 ``` 3. map(双向迭代器): ```cpp std::map<std::string, int> m{{"apple",1}, {"banana",2}}; for(auto it = m.begin(); it != m.end(); ++it) { // 访问键值对 std::cout << it->first << ": " << it->second; // 输出apple:1 banana:2 } ``` 四、与算法结合 ```cpp #include <algorithm> #include <vector> int main() { std::vector<int> nums{5,3,7,1,4}; // 使用迭代器排序 std::sort(nums.begin(), nums.end()); // 使用迭代器查找 auto found = std::find(nums.begin(), nums.end(), 7); if(found != nums.end()) { std::cout << "Found at position: " << found - nums.begin(); } return 0; } ``` 五、特殊迭代器使用 1. 反向迭代器: ```cpp std::vector<int> v{1,2,3}; for(auto rit = v.rbegin(); rit != v.rend(); ++rit) { std::cout << *rit << " "; // 输出3 2 1 } ``` 2. const迭代器: ```cpp const std::vector<int> cv{9,8,7}; auto cit = cv.cbegin(); // 只读迭代器 // *cit = 5; // 错误!不能修改 ``` 六、注意事项 1. 迭代器失效问题(修改容器后需要重新获取迭代器): ```cpp std::vector<int> v{1,2,3}; auto it = v.begin(); v.push_back(4); // 可能导致迭代器失效! // 此时应重新获取 it = v.begin() ``` 2. 越界检查: ```cpp std::vector<int> emptyVec; // 错误示例: // auto bad_it = emptyVec.begin(); // std::cout << *bad_it; // 未定义行为! ``` 3. 类型匹配: ```cpp std::list<int> lst{1,2,3}; // std::sort(lst.begin(), lst.end()); // 错误!list需要sort成员函数 ``` 掌握迭代器使用需要结合实践,建议从vector开始练习,逐步尝试不同容器类型,注意区分不同迭代器操作权限和特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值