栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++——迭代器的详细案例讲解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++——迭代器的详细案例讲解

文章目录
  • 迭代器的分类:
    • 1、顺序迭代器
    • 2、插入型迭代器
      • 2.1随机插入型迭代器
        • ①insert_iterator 的使用:
        • ②inserter的使用:
        • ③如何自己实现inserter
      • 2.2后插型迭代器
        • ①back_insert_iterator的使用
        • ②back_inserter的使用:
        • ③如何自己实现back_inserter
      • 2.3前插型迭代器
        • ①front_insert_iterator的使用
        • ②front_inserter的使用
    • 3、流迭代器
      • 3.1 ostream_iterator
      • 3.2istream_iterator

注:文章代码中出现的一些函数,比如Print(),只在第一个代码块中引入,如果后续出现,不再引入。

迭代器的分类:

迭代器总的可以分为三种:
顺序迭代器(遍历型迭代器)
插入型迭代器
流迭代器

1、顺序迭代器

iterator 正向迭代器
reverse_iterator 反向迭代器
const_iterator 常量正向迭代器
const_reverse_iterator 常量反向迭代器

①迭代器测试案例:

#include 
#include 
#include 
using namespace std;
//使用迭代器正向打印容器内元素
template 
void Print(T& src)
{
	typename T::iterator it = src.begin();
	for (; it != src.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//使用迭代器反向打印容器内元素
template 
void Reverse_Print(T& src)
{
	typename T::reverse_iterator it = src.rbegin();
	for (; it != src.rend(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	Print(v1);
	Reverse_Print(v1);
	return 0;
}


②常量迭代器测试案例
所谓常量迭代器就是在上面迭代器的基础上用const进行修饰,主要目的在于:
常量的容器,比如 const vectorv2,如果要用Print()打印函数进行输出,由于里面的迭代器不是常量就会报错,如下:
所以需要使用常量迭代器,从而保证不会改变容器里面的值。

使用案例:

#include 
#include 
#include 
using namespace std;
//常量迭代器的打印
template 
void c_Print(T& src)
{
	typename T::const_iterator it = src.cbegin();
	for (; it != src.cend(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//常量迭代器的反向打印
template 
void c_Reverse_Print(T& src)
{
	typename T::const_reverse_iterator it = src.crbegin();
	for (;it != src.crend(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);

	}
	const vector v2(v1.begin(), v1.end());//使用迭代器对v2进行构造
	c_Print(v2);
	c_Reverse_Print(v2);
	return 0;
}

运行结果:

2、插入型迭代器

insert_iterator 随机插入型迭代器(内部调用的是insert())
back_insert_iterator 后插型迭代器(内部调用的是push_back())
front_insert_iterator 前插型迭代器(内部调用的是push_front())

2.1随机插入型迭代器 ①insert_iterator 的使用:
int main()
{
    vectorv1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	vectorv2;
	insert_iterator> it(v2, v2.begin());
	//insert_iterator 指定容器,以及容器要插入的起始位置,内部调用的是insert();
	for (int i = 0; i < 10; i++)
	{
		*it = i + 100;
	}
	Print(v2);
	return 0;
}

运行结果:

②inserter的使用:

请编写一个函数以实现:将一个容器当中的数据插入到另一个容器指定位置

template 
void Insert(const T& first,const T& last,INSERT_T insert_t)
{
	T tmp = first;
	for (; tmp != last; tmp++)
	{
		*insert_t=*tmp;
	}
}
int main()
{
   vectorv1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	vectorv2;
	insert_iterator> it(v2, v2.begin());
	//insert_iterator 指定容器,以及容器要插入的起始位置,内部调用的是insert();
	for (int i = 0; i < 10; i++)
	{
		*it = i + 100;
	}
	Print(v2);
	
	//通过上述问题中的函数将v1中的全部数据插入到v2第一个元素之后
	Insert(v1.begin(), v1.end(), inserter(v2, v2.begin()+1));
	Print(v2);
	return 0;
}

运行结果:

③如何自己实现inserter

inserter 函数模板封装类模板对象的产生——两个参数传进去实现一个insert_iterator的对象

template 
insert_iterator  My_inserter(T& t , typename T::iterator it)
{
	return insert_iterator(t, it);
}

**注意: 关联容器、栈、队列容器无法使用插入型迭代器 **

2.2后插型迭代器 ①back_insert_iterator的使用
int main()
{
     vectorv1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	vectorv2;
	insert_iterator> it(v2, v2.begin());
	for (int i = 0; i < 10; i++)
	{
		*it = i + 100;
	}
	Print(v2);
	back_insert_iterator> it2(v2);
	*it2 = 999;
	Print(v2);
	return 0;
}

运行结果:

②back_inserter的使用:

问题:将一个容器指定范围内的数据插入到另外一个容器的末尾

template 
void Back_Insert(const T& first, const T& last, BACK_INSERT back_insert)
{
	T tmp=first;
	for (; tmp != last; tmp++)
	{
		*back_insert = *tmp;
	}
}
int main()
{
     vectorv1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	vectorv2;
	insert_iterator> it(v2, v2.begin());

	for (int i = 0; i < 10; i++)
	{
		*it = i + 100;
	}
	Print(v2);
	//将v1全部的数据插入v2的末尾
	Back_Insert(v1.begin(),v1.end(), back_inserter (v2));
	Print(v2);
	return 0;
}

运行结果:

③如何自己实现back_inserter
template 
back_insert_iterator My_back_inserter(T& t)
{
	return back_insert_iterator (t);
}
2.3前插型迭代器 ①front_insert_iterator的使用
int main()
{
	list list1;
	for (int i = 0; i < 10; i++)
	{
		list1.push_back(i);
	}
	front_insert_iterator> it(list1);
	*it = 999;
	Print(list1);
	return 0;
}

运行结果:

②front_inserter的使用
int main()
{
	list list1;
	for (int i = 0; i < 10; i++)
	{
		list1.push_back(i);
	}
	front_insert_iterator> it(list1);
	*it = 999;
	auto it2 = front_inserter(list1);
	*it2 = 666;
	Print(list1);
	return 0;
}

运行结果:

3、流迭代器

输出流迭代器(同时也是插入型迭代器)
输入流迭代器

3.1 ostream_iterator

测试案例1:

int main()
{
     ostream_iterator ito(cout, " ");
	for (int i = 0; i < 10; i++)
	{
		ito = i;
	}
	cout << endl;
}

测试案例2:

int main()
{
	list list1;
	for (int i = 10; i < 20; i++)
	{
		list1.push_back(i);
	}

	ostream_iterator ito(cout, " ");
	Insert(list1.begin(), list1.end(), ito);
	cout << endl;
	return 0;
}
3.2istream_iterator
int main()
{
	ostream_iterator ito(cout, " ");
	istream_iterator iti(cin);
	int a;
	a = *iti;
	ito = a;;
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/589519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号