- 迭代器的分类:
- 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(),只在第一个代码块中引入,如果后续出现,不再引入。 迭代器的分类:
迭代器总的可以分为三种:
顺序迭代器(遍历型迭代器)
插入型迭代器
流迭代器
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; }
运行结果:
insert_iterator 随机插入型迭代器(内部调用的是insert())
back_insert_iterator 后插型迭代器(内部调用的是push_back())
front_insert_iterator 前插型迭代器(内部调用的是push_front())
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;
}
运行结果:
请编写一个函数以实现:将一个容器当中的数据插入到另一个容器指定位置
templatevoid Insert(const T& first,const T& last,INSERT_T insert_t) { T tmp = first; for (; tmp != last; tmp++) { *insert_t=*tmp; } } int main() { vector v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } vector v2; 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 函数模板封装类模板对象的产生——两个参数传进去实现一个insert_iterator的对象
templateinsert_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;
}
运行结果:
问题:将一个容器指定范围内的数据插入到另外一个容器的末尾
templatevoid Back_Insert(const T& first, const T& last, BACK_INSERT back_insert) { T tmp=first; for (; tmp != last; tmp++) { *back_insert = *tmp; } } int main() { vector v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } vector v2; 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; }
运行结果:
template2.3前插型迭代器 ①front_insert_iterator的使用back_insert_iterator My_back_inserter(T& t) { return back_insert_iterator (t); }
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;
}
运行结果:
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;
}
运行结果:
输出流迭代器(同时也是插入型迭代器)
输入流迭代器
测试案例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;
}



