泛型学习笔记(二)

使用泛型算法

需要头文件algorithm

  1. find(_InIt _First, const _InIt _Last, const _Ty& _Val)用于搜索无序集合中是否存在某值。
  2. binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)用于搜索有序集合中是否存在某值。
  3. count(const _InIt _First, const _InIt _Last, const _Ty& _Val)返回数值相符的元素数目。
  4. max_element(_FwdIt _First, _FwdIt _Last)将一对泛型指针传入,返回范围内的最大值。
  5. copy(_InIt _First, _InIt _Last, _OutIt _Dest)接受两个泛型指针,标出复制范围,第三个泛型指针指向复制行为的目的地的第一个元素。
  6. sort(const _RanIt _First, const _RanIt _Last)接受两个泛型指针,对标出的范围进行排序。

设计泛型算法

Function Object(函数对象)

需要头文件functional
算术运算 pluse<type>…
关系运算 greater<type>…
逻辑运算 logical_and<type>…

Function Object Adapter(函数对象适配器)

Function Object Adapter是将函数对象的参数绑定至某个特定值。例如,less<type>期望外界传入两个值,每个值都必须和用户指定的元素进行比较。理想情况下,将less转化为一个一元运算符。这可以通过第二个参数绑定(bind)至用户指定的数值完成。这样less<type>会将每个元素拿出来一一与用户指定的值比较。
bind1st会将指定值绑定至第一操作数,bind2nd会将指定值绑定至第二操作数。

Map

Map被定义为一对数值,key通常是字符串,扮演者索引的角色,另一个数值是value。

#include<map>
map<type, type> words;

map的find()函数,如果key存在,find()函数会返回一个iterator,指向key/value形成一个pair,反之返回end()。
map的count()函数。会返回某特定项在map内的个数。

Set

set是由一组key值组成,所以set中的元素的值是唯一的。

#include<set>
#include<string>
set<string> word_exclusion;
while(cin >> tword)
{
	if(word_exclusion.count(tword))
		continue;
	words[tword]++;
}

Iterator Inserter

back_inserter()会以容器的push_back()取代assignment的作用:

vector result_vec;
unique_copy(ivec.begin(), ivec.end(), back_inserter(result_vec));

inserter()会以容器的insert()函数取代assignment运算符。inserter()会接收两个参数:容器、iterator:

vector svec_res;
unique_copy(svec.beign(), svec.end(), inserter(svec_res, svec_res.end()));

front_inserter()会以容器的push_front()函数取代assignment运算符。只适应于list 和 deque。

iostream Iterator

需要头文件iterator
标准库定义了有供输入输出使用的 iostream iterator类,称为istream_iterator和 ostream_iterator,分别支持单一类型的元素读取和写入。
案例
从标准输入设备读取一串string元素,将它们储存到vector内,并进行排序,最后再将这些字符串写回标准输出设备。

#include<iostream>
#include<iterator>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
	istream_iterator<string> is(cin);
	istream_iterator<string> eof;

	vector<string> text;
	copy(is, eof, back_inserter(text));

	sort(text.begin(), text.end());

	ostream_iterator<string> os(cout, " ");
	copy(text.begin(), text.end(), os);
}

如果是文件读写

#include<iostream>
#include<fstream>
#include<iterator>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
	ifstream in_file("a.txt");
	ofstream out_file("b.txt");

	if (!in_file || !out_file)
	{
		cerr << "不能够打开这些文件" << endl;
		return -1;
	}

	istream_iterator<string> is(in_file);
	istream_iterator<string> eof;

	vector<string> text;
	copy(is, eof, back_inserter(text));

	sort(text.begin(), text.end());

	ostream_iterator<string> os(out_file, " ");
	copy(text.begin(), text.end(), os);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值