自学内容网 自学内容网

C++迭代器 iterator详解

目录

什么是迭代器

迭代器的类型

迭代器的用法

 三种迭代器

范围for


什么是迭代器

它提供了一种访问容器(如列表、集合等)中元素的方法,而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构,而无需关心这些数据结构的具体实现细节。类似于指针指向对应的元素并且能对这个元素进行修改和使用。

迭代器的类型

有4种迭代器形式:

正向迭代器:

语法:容器名::iterator 迭代器名字;

正向常量迭代器:

语法:容器名::const_iterator 迭代器名字;

反向迭代器:

语法:容器名::reverse_iterator 迭代器名字;

反向常量迭代器:

语法:容器名::const_reverse_iterator 迭代器名字;

迭代器的用法

前面说迭代器类似于一个指针,所以用法和指针也是类似的 

vector<int> v = {1,2,3,4};
vector<int>::iterator i;//定义一个vector的迭代器
i = v.begin();//让i 等于 v 的第一个元素

int *p = &v[i];//定义一个指针

int j = *i;
int k = *p;

此时 j == k 。说明了迭代器和指针是类似的,因为迭代器就是封装了对应类型的指针。

迭代器都可以进行++:

正向迭代器的++ 是向后移动。

反向迭代器的++ 是向前移动。

下面我们使用vector进行遍历和修改:

//vector是c++的容器,类似于一个数组,但是支持变长
vector<int> v;
vector<int>::iterator it;
//这里给v 中插入了5个数字 0 1 2 3 4 5
for (int i = 0; i < 5; i++)
{
v.push_back(i);
}
//打印v的内容
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
//改变v的内容
for (it = v.begin(); it != v.end(); ++it)
{
*it *= 2;
}
cout << endl;
//打印改变后的内容
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
    //用反向迭代器遍历v
for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
cout << *j << " ";

结果如下:

注意:

1.it 用的是 != v.end(),这是为什么?而不是 < end() 在部分容器里用 < end(),是可以的,比如现在使用的vector,但是对于部分不是连续空间的容器类似 list 等等无法通过 < end()比较当前位置。

2.可以看出反向迭代器的++是逆向的。

3.为什么用的是前置++而不是后置++?

因为前置++的效率更高

// 前置++
Date& Date::operator++()
{
// 复用operator+=
*this += 1;
return *this;
}
// 后置++
Date Date::operator++(int)
{
Date tmp(*this);// 拷贝构造tmp,用于返回
// 复用operator+=
*this += 1;
return tmp;
}

如上代码:

1.operator区分前置++和后置++是看有没有参数(语法规定)

2.为什么前置++效率高,因为前置++直接对 *this操作然后返回,后置++则是先拷贝构造了一份tmp。

 三种迭代器

第一只:正向迭代器

只可以进行++ ,和*i,还支持== != 等操作。

第二只:双向迭代器

可以进行++ 或者 -- 。比正向迭代器多一种--手段。

第三只:随机迭代器

拥有上面两种迭代器的全部功能。并且支持随机访问,i + 10,代表了往后10个元素。同时支持下标访问数组 

vector<int>::iterator i;
i += 10;//向后移动10个元素
i[10];//第10个元素的位置

对于随机迭代器通常只出现在物理空间连续的容器上,例如vector。

而物理空间不连续的例如list,上是没有随机访问这种功能的。

和 数组 和 链表的定义是类似的。

所以不同容器的迭代器不同,有些容器没有迭代器。

范围for

范围for就是利用迭代器实现的遍历容器的方法

具体使用如下:

    vector<int> v;
    //这里给v 中插入了5个数字 0 1 2 3 4 5
for (int i = 0; i < 5; i++)
{
v.push_back(i);
}
    //范围for
    for (int num : v)
{
cout << num<<' ';
}

范围for其实就是迭代器遍历,其中 int num 就是 *it .

结果如下:


原文地址:https://blog.csdn.net/a1275174052/article/details/142439575

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!