【STL容器 - 迭代器】用法总结
2026-08-19 11:15:18
发布于:浙江
1 迭代器的概念
迭代器(iterator) 是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++ 更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。
C语言有指针,指针用起来十分灵活高效。
C++语言有迭代器,迭代器相对于指针而言功能更为丰富。
vector,是数组实现的,也就是说,只要知道数组的首地址,就能访问到后面的元素。所以,我们可以通过访问vector的迭代器来遍历vector容器元素。
List,是链表实现的,我们知道,链表的元素都存储在一段不是连续的地址空间中。我们需要通过next指针来访问下一个元素。那么,我们也可以通过访问list的迭代器来实现遍历list容器元素。
由此可见,迭代器和容器是密不可分的、紧密相连的的关系。不同的容器,它们的迭代器也是不同的,但是它们的迭代器功能是一样的。假如没有迭代器,由于vector和list容器的存储特点,你需要两种算法去实现遍历vector和list容器的功能,复杂且低效。有了迭代器,遍历容器的效率会大大提高。
2 迭代器的使用
2.1 迭代器的常用操作
-
*iter :对iter进行解引用,返回迭代器iter指向的元素的引用
-
iter->men :对iter进行解引用,获取指定元素中名为men的成员。等效于(*iter).men
-
++ iter / iter ++ :给iter加1,使其指向容器的下一个元素
-
-- iter / iter -- :给iter减1,使其指向容器的前一个元素
-
iter1==iter2 :比较两个迭代器是否相等,当它们指向同一个容器的同一个元素或者都指向同同一个容器的超出末端的下一个位置时,它们相等
-
iter1!=iter2
2.2 迭代器遍历容器
容器都有成员begin和end,其中begin成员复制返回指向第一个元素的迭代器(用*迭代器打印出元素值),而end成员返回指向容器尾元素的下一个位置的迭代器,它是一个不存在的元素位置。
例1:遍历容器vector
for( it = vector.begin(); it != vector.end(); it++ )
cout<<*it<<endl;
例2:vector容器的迭代器定义
vector<int>::iterator it; //it能读写vector<int>的元素
vector<int>::const_iterator it;//it只能读vector<int>的元素,不可以修改vector<int>中的元素
例3:逆序迭代
for( std::vector<int>::reverse_iterator it = v.rbegin(); it!=v.rend();it++ )
cout<<*it<<endl;
3 迭代器函数
3.1 advance函数
简介
advance()函数在头文件:<iterator>。
其可以将指定迭代器前移或后移 n 个位置的距离。advance() 函数没有任何返回值,其移动的是 it 迭代器本身。
使用
int main() {
//创建一个 vector 容器
vector<int> myvector{ 1,2,3,4 };
//it为随机访问迭代器,其指向 myvector 容器中第一个元素
vector<int>::iterator it = myvector.begin();
//输出 it 迭代器指向的数据
cout << "移动前的 *it = " << *it << endl;
//借助 advance() 函数将 it 迭代器前进 2 个位置advance(it, 2);
cout << "移动后的 *it = " << *it << endl;
return 0;
}
程序执行结果为:
移动前的 *it = 1
移动后的 *it = 3
3.2 prev函数
简介
prev函数在头文件:<iterator>。
prev 原意为“上一个”,但 prev() 的功能远比它的本意大得多,该函数可用来获取一个距离指定迭代器 n 个元素的迭代器,即生成一个新的迭代器。
prev函数格式为:prev(it, n)。其中,it 为源迭代器,其类型只能为双向迭代器或者随机访问迭代器;n 为指定新迭代器距离 it 的距离,默认值为 1。该函数会返回一个距离 it 迭代器 n 个元素的新迭代器。当 n 为正数时,其返回的迭代器将位于 it 左侧;反之,当 n 为负数时,其返回的迭代器位于 it 右侧。
使用
int main() {
//创建并初始化一个 list 容器
std::list<int> mylist{ 1,2,3,4,5 };
std::list<int>::iterator it = mylist.end();
//获取一个距离 it 迭代器 2 个元素的迭代器,由于 2 为正数,newit 位于 it 左侧auto newit = prev(it, 2);
cout << "prev(it, 2) = " << *newit << endl;
//n为负数,newit 位于 it 右侧
it = mylist.begin();
newit = prev(it, -2);
cout << "prev(it, -2) = " << *newit;
return 0;
}
程序执行结果为:
prev(it, 2) = 4
prev(it, -2) = 3
注意
使用prev函数要保证STL容器不为空。
3.3 next函数
简介
next函数位于头文件:<iterator>
和 prev相反,next 原意为“下一个”,但其功能和 prev() 函数类似,即用来获取一个距离指定迭代器 n 个元素的迭代器。
函数格式:next(it, n)。其中 it 为源迭代器,其类似可以为前向迭代器、双向迭代器以及随机访问迭代器;n 为指定新迭代器距离 it 的距离,默认值为 1。该函数会返回一个距离 it 迭代器 n 个元素的新迭代器。当 it 为前向迭代器时,n 只能为正数,该函数最终得到的新迭代器位于 it 右侧;当 it 为双向迭代器或者随机访问迭代器时,若 n 为正数,则得到的新迭代器位于 it 右侧,反之位于 it 左侧。
使用
int main() {
//创建并初始化一个 list 容器
std::list<int> mylist{ 1,2,3,4,5 };
std::list<int>::iterator it = mylist.begin();
//获取一个距离 it 迭代器 2 个元素的迭代器,由于 2 为正数,newit 位于 it 右侧auto newit = next(it, 2);
cout << "next(it, 2) = " << *newit << endl;
//n为负数,newit 位于 it 左侧
it = mylist.end();
newit = next(it, -2);
cout << "next(it, -2) = " << *newit;
return 0;
}
程序执行结果为:
next(it, 2) = 3
next(it, -2) = 4
可以看到,和 prev() 函数恰好相反,当 n 值为 2 时,next(it, 2) 函数获得的新迭代器位于 it 迭代器的右侧,距离 2 个元素;反之,当 n 值为 -2 时,新迭代器位于 it 迭代器的左侧,距离 2 个元素。
全部评论 6

10小时前 来自 浙江
0dddddddddddddddddddddddd
10小时前 来自 浙江
0ddddddddddddddddd
10小时前 来自 浙江
0dddddddddddddddddddddddd
10小时前 来自 浙江
0dddddddddddddddddddddddddd
10小时前 来自 浙江
0ddddddddddddddddddddd
10小时前 来自 浙江
0





























有帮助,赞一个