文章目录
使用泛型算法
需要头文件algorithm
- find(_InIt _First, const _InIt _Last, const _Ty& _Val)用于搜索无序集合中是否存在某值。
- binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)用于搜索有序集合中是否存在某值。
- count(const _InIt _First, const _InIt _Last, const _Ty& _Val)返回数值相符的元素数目。
- max_element(_FwdIt _First, _FwdIt _Last)将一对泛型指针传入,返回范围内的最大值。
- copy(_InIt _First, _InIt _Last, _OutIt _Dest)接受两个泛型指针,标出复制范围,第三个泛型指针指向复制行为的目的地的第一个元素。
- 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);
}