c++迭代器介绍
2021/7/8 17:09:49
本文主要是介绍c++迭代器介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
迭代器的简介
- 迭代器类似于指针类型,它也提供了对对象的间接访问。
- 指针是c语言中就有的东西,迭代器是c++中才有的,指针用起来灵活高效,迭代器功能更丰富些。
- 迭代器提供一个对容器对象或者string对象的访问的方法,并且定义了容器范围。
使用迭代器
迭代器和指针不一样,容器和string有迭代器类型同时拥有返回迭代器的成员。比如,容器都有的成员begin和end,其中begin成员复制返回指向第一个元素(第一个字符)的迭代器,而end成员返回指向容器(或string对象)尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以叫end返回的是尾后迭代器。一般我们清楚一个迭代器的准确类型是什么,所以我们都是使用auto或者decltype来定义变量的。
vector<int> v; auto b=v.begin(); decltype(v.begin()) b=v.begin();
标准容器迭代器的运算符
*iter 返回迭代器iter所指元素的引用 iter->men 解引用iter并获得该元素的名为men的成员,相当于(*iter).men ++iter 令iter指示容器的下一个元素 --iter 令iter指示容器的上一个元素 iter1==iter2 如果两个迭代器指示的是同一个元素或者它指向同一个容器的尾后迭代器,则相等.
下面给出一个使用迭代器运算符修改容器元素的代码示例:
#include<iostream> using namespace std; #include<vector> int main() { vector <int> v(10, 1); int i=1; cout << "未修改前:"; for (auto v_quote : v) { cout << v_quote << " " ; //未修改前 } cout << endl; for (auto v_quote = v.begin(); v_quote != v.end(); ++v_quote) { *v_quote += i; ++i; } cout << "修改后:"; for (auto v_quote : v) { cout << v_quote << " "; } cout << endl; system("pause"); return 0; }
迭代器的类型
那些拥有迭代器的标准库类型都是使用:iterator和const_iterator来表示迭代器的类型:
vector <int> ::iterator it; //it能读写vector<int>的元素 vector <int>::const_iterator it; //it只能读vector<int>的元素,不可以修改vector<int>中的元素 string::iterator s; //s可以读写string对象中的元素 string::const_iterator s; //s只可以读string对象中的元素,不可以修改string对象中的元素
const_iterator和常量指针一样,只可以读取但不可以修改所指的值。在c++11的新标准中,为了便于得到const_iterator类型的返回值,引入两个新的函数,分别是cbegin和cend,功能类似于begin和end,只是返回的值类型为const_iterator;
vector动态增长的限制:
- 不能再范围for循环中向vector对象添加元素。
- 任何一种可能改变vector容量的操作,比如push_back,都会使该vector对象的迭代器失效。
迭代器的运算
iter+n //迭代器加上一个整数值仍得到一个迭代器,迭代器指示的新位置向前移动了,指示可能是容器的一个元素或者是尾部的下一个位置 iter-n //相反,迭代器指示的位置向后移动了,指示可能是容器的一个元素或者是尾部的下一个位置 iter1+=n //等价于iter1+n iter1-=n //等价于iter2-n iter1-iter2 //两个迭代器的距离,
两个迭代器返回的值,在string和vector都为它定义了一个新的类型–difference_type,它是一个带符号的整型。
使用迭代器运算的一个经典算法是二分查找,代码如下:
#include<iostream> using namespace std; #include<vector> #include<algorithm> int main() { vector <int> v{ 1,20,10,5,6,7,90 }; cout << "请输入需要查找的值:"; int temp = 0; cin >> temp; sort(v.begin(), v.end()); //使用排序函数对容器vector中的元素进行排序 auto beg = v.begin(); auto end = v.end(); auto mid = v.begin()+ (end - beg) / 2; /* 二分查找法: 每次都拿中间的那个值和需要查找的值做比较,如果相等就退出查找 如果查找的值比中间那个值小,则向前查找 如果查找的值比中间那个值大,则向后查找 */ while (mid != end && * mid != temp) { if (temp < *mid) { end = mid; } else { beg = mid+1; } mid = beg + (end - beg) / 2; } if (* mid == temp) cout << "find" << endl; else cout << "Not find" << endl; system("pause"); return 0; }
输出结果:
这篇关于c++迭代器介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享