C++标准模板库---迭代器介绍(iterator、const_iterator)

版权声明:本文章刊载的内容,多数为读者作者笔记,笔记内容来自于潭州教育提供的学习资源以及读者本人阅读的文章,特此声明! https://blog.csdn.net/qq_41453285/article/details/85802431

迭代器

概念:C++的一种机制,用来遍历标准模板库容器中的元素,是一种"智能"指针

一、迭代器的特点

  • 迭代器是一种智能指针,具有遍历复杂数据结构的能力
  • 不同的容器有不一样的内部结构,因此会有一样的迭代器类型
  • 迭代器定义后,并不属于某一实例容器对象,只要是属于该迭代器类型的容器类型都可用

二、迭代器的使用

1.原理:迭代器定义之后,可指向指定类型容器内的元素,从而达到访问容器内元素的能力

2.用法

  • 关键字interator代表声明一个迭代器,前面需要指明类型
  • 迭代器指向容器的某一位置
  • 通过*解引用获取元素的引用(注:*得到的是元素的引用)。也可用->得到该元素的成员(下面代码会介绍)
string s= "HelloWorld";
string::iterator i; //一个string类型的迭代器
for (i = s.begin(); i != s.end(); i)
{
    cout << *i;
}

3.解引用和成员访问

注意:访问成员时,要对迭代器加上(),否则产生的意义不同

(*item).empty(); //正确用法
*item.empty; //错误用法

 上面代码中:第一行是解引用迭代器。而第二种是试图访问item中的empty成员,但是item是个迭代器,显示是错误的

三、begin()、end()

1.概念:begin()、end()代表容器的特殊位置,分别为元素的第一个位置与最后一个元素的下一个位置

  • 下面比如是vector的一个模型,则begin()、end()分别代表一下位置

2.为什么要这样设计?

  • begin():我们在遍历容器的元素的时候,一般要获取该元素的首元素,因此设计bengin()
  • end():当我们用迭代器遍历容器的时候,一般需要结束条件(如遍历到最后一个元素),但是遍历到最后一个元素时又不能舍弃它,因此将最后一个元素的下一位置作为结束标志

3.提醒

C++11新标准中cbegin()、cend()会在下面介绍

四、interator、const_iterator关键字

1.迭代器的核心关键字

2.分类

  • interator:当我们需要对容器元素进行修改、删除等操作时或者对象是非常量时使用
  • const_iterator:当我们只是遍历容器元素,而不更改容器元素时或者对象是常量时使用

注意:上面所说的常量是指常量容器,而不是容器内的元素为常量

3.两者的选择

  • 建议:如果我们只是简单的遍历容器元素或者对象是常量时,一般使用const_iterator比较合适

4.C++11新标准:cbegin()、cend()

C++11引进了两个新函数,分别为cbegin()、cend(),其两者的功能类似于begin()、end()

  • C++11新标准之前,iterator与const_iterator都使用begin()、end()两个辅助函数遍历容器。
  • C++新标准之后,const_iterator既可以使用可以使用begin()、end(),也可以使用cbegin()、cend()。但是iterator还是只能使用begin()、end()
vector<int> v;
const vector<int> v2;
auto it1=v.begin(); //v1是vector<int>::iterator类型
auto it2=v2.brgin();//v2是vector<int>::const_iterator类型

五、迭代器的运算

说明:迭代器的运算符一般都是对迭代器所指元素的位置进行比较,返回的是比较结果或者改变迭代器的位置

迭代器没有+运算

例如有迭代器iter,iter1,iter2

*iter  返回迭代器所指元素的引用
iter->data  代表当前所指位置处元素的的指针,可以访问其函数或成员,等价于(*iter).data
++iter  令迭代器指向容器的下一个元素
--iter  令迭代器指向容器的前一个元素
iter1==iter2  判断两个迭代器的位置是否相同
iter1!=iter2  同上
>、>=、<、<=    同上

iter + n  改变迭代器的位置
iter - n  同上
iter +=n  同上
iter -=n  同上
iter1 - iter2  两个迭代器相减,返回它们之间的距离
  • 实例:遍历vector中的元素,如果遇到空白,停止遍历 
vector<string> v = {"Hello","fwe",""};
vector<string>::iterator iter;
for (iter = v.begin(); iter != v.end() && !iter->empty(); ++iter)
{
    cout << *iter<<"\t";
}

六、一些代码事例

  • 将string中的第一个字符改为大写
string s = "helloWorld";
string::iterator it;
if (s.begin() != s.end())//先判断s不为空
{
    it = s.begin();
    *it = toupper(*it);
}
  • 使用容器元素的函数
(*item).empty(); //判断是否为空
(*item).size(); //得到大小
  • 得到中间元素的迭代器
auto mid=v.begin()+vi.size()/2;
  • 折半查找string中的一个元素
string s = "abcdefghj";
char foundChar = 'e';
string::const_iterator l_iter=s.begin();
string::const_iterator r_iter=s.end();
string::const_iterator mid_iter = s.begin() + (r_iter - l_iter) / 2;
while (mid_iter != r_iter && *mid_iter != foundChar)
{
    if (*mid_iter > foundChar)
    {
        r_iter = mid_iter;
    }
    else
    {
        l_iter = mid_iter + 1;
    }
    mid_iter = l_iter + (r_iter - l_iter) / 2;
}
cout << *mid_iter << endl;

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/85802431