8.5.3 流迭代器
流迭代器的思想是将输入输出流当做序列,用迭代器去遍历。
1.输出流迭代器
用于向流中写入数据,它是利用“<<”操作符将指定类型的数据写入到流中,流对象是在构造输出流迭代器时指定,输出流迭代器构造函数有以下两种形式,如下所示:
ostream_iterator(ostream& out);
ostream_iterator(ostream& out, const char* delimiter);
参数out指将数据输出到输出流,第二种形式中的delimiter参数表示两个输出数据之间的分隔符,该参数是可选的。
输出流迭代器时典型的输出迭代器,它具备输出迭代器的所有功能,在算法中使用输出流迭代器时,可以直接访问输出流
copy(d1.begin(), d1.end(), ostream_iterator(cout, " ");
copy()的第三个参数是创建一个输出int类型数据的输出流迭代器,将数据输出到cout流中,以空格为分隔符,因此此次copy()函数就是将[d1.begin().d1.end)区间的数据用输出流迭代器输出到屏幕。
2.输入流迭代器
输入流迭代器用于从流中读取数据,它是利用“>>”操作符将指定类型的数据从流中读出,流对象是在构造输入流迭代器时指定,输入流迭代器构造函数如下所示
istream_iterator(istream& in);
参数in指要从中读取数据的流。输入流迭代器是典型的输入迭代器,它支持输入迭代器的所有操作。
8.6 迭代器辅助函数
1.advance()函数
可使相关的迭代器前进或后退,增加的速度有参数决定。
局限性:
(1)非随机访问迭代器执行advance()函数移动迭代器,其执行性能并不佳。
(2)advance()在执行时不检查是否超过end(),如果迭代器已经超过序列有效范围,就会导致操作出错。
2.distance()函数
用于处理两个迭代器之间的距离。
3.iter_swap()函数
用于交换两个迭代器的元素值。
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char str[] = { 'a','b','c','d','e','f','g' };
list lt;
lt.assign(str, str + sizeof(str)/sizeof(char));
copy(lt.begin(), lt.end(), ostream_iterator(cout, " "));
cout << endl;
list::iterator it = lt.begin();
advance(it, 5); //将迭代器向下移动5个单位
cout << "将迭代器向下移动5个单位后,指向的元素为:" << *it << endl;
cout << "the diatance between begin and f is:" << distance(lt.begin(), it) << endl;
iter_swap(lt.begin(), it); //交换两个位置的元素
cout << "交换两个位置的元素之后:";
copy(lt.begin(), lt.end(), ostream_iterator(cout, " "));
cout << endl;
system("pause");
return 0;
}
8.7 算法
8.7.1 算法概述
1.算法的头文件
STL中提供的所有算法都包含在三个头文件中:
头文件numeric很小,只包括几个在序列中进行简单数学运算的函数模板,以及加法和乘法在序列中的一些操作。
头文件functional中则定义了一些模板,用于声明一些函数对象。
2.算法的分类
8.7.2 常用算法
1.for_each()算法
for_each()属于非可变序列算法,此算法非常灵活,可以同时处理修改每一个元素。for_each()算法对[begin,end)区间中的每个元素都调用func函数(对象进行操作),它不会对区间中的元素做任何谢盖,也不会改变原来的元素次序。
2.find()算法
find()也属于非可变序列算法,用于在指定区间查找某一元素是否存在。find()算法用于在[begin,last)区间查找value元素是否存在,如果存在就返回指向这个元素的迭代器,如果不存在,就返回end。
3.copy()算法
它的功能是完成元素的复制。copy()函数实现将[first, last)区间的元素复制到另一个地方,这个地方的起始位置为DestBeg。
4.sort()算法
sort()属于可变序算法,它支持对容器中的所有元素进行排序。
sort()算法所使用的迭代区间必须是随机迭代器,因此只能适用于vector与deque容器,list容器不支持随机迭代器,不能使用该算法,但list容器提供了sort()成员函数,用于自身的元素排序。
5.accumulate()算法
该函数的功能是将[first,last)区间的数值累加,累加的初始值为t,它返回的是元素累加结果。第二种形式可以按照指定的规则将元素相加。
#include
#include
#include
#include
#include
#include
using namespace std;
template
class Muli //类模板
{
private:
T value;
public:
Multi(const T& v):value(v){} //构造函数
void operator()(T& elem) const{ elem *= value; } //重载()运算符
};
void print(int elem) //打印元素
{
cout << elem << " ";
}
int main()
{
int arr[] = { 21, 4, 55, 22, 46, 79, 9, 5, 78, 34, 100 };
vector v;
//用数组给v容器赋值
v.assign(arr, arr + sizeof(arr) / sizeof(int));
//调用copy()构造函数将容器中元素输出
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl;
//调用find()算法查找容器中是否存在值为200的元素
vector::iterator it = find(v.begin(), v.end(), 200);
if(*it == 200)
cout << "容器中有值为200的元素" << endl;
else
cout << "容器中不存在值为200的元素" << endl;
sort(v.begin(), v.end()); //调用sort()算法将容器中元素从小到大排列
cout << "排序之后:" << endl;
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl;
int sum = accumulate(v.begin(), v.end(), 0); //累加容器中元素
cout << "sum = " << sum << endl;
system("pause");
return 0;
}