第 8 章 初始 JSTL(下)

8.5.3 流迭代器

流迭代器的思想是将输入输出流当做序列,用迭代器去遍历。

  • ostream_iterator:输出流迭代器,用于向ostream流写入数据;
  • instream_iterator:输入流迭代器,用于从istream流读取数据;
  • ostreambuf_iterator:输出流缓冲区迭代器,用于向流缓冲区写入数据;
  • istreambuf_iterator:输入流缓冲区迭代器,用于从流缓冲区读取数据;

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 章 初始 JSTL(下)_第1张图片

8.7 算法

8.7.1 算法概述

1.算法的头文件

STL中提供的所有算法都包含在三个头文件中:,其中头文件algorithm是在头文件中最大的,它由一大堆函数模板组成,其中涉及的功能有比较、交换、查找、遍历、复制、修改、删除、合并、排序等。

头文件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; 
}
 

第 8 章 初始 JSTL(下)_第2张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++)