11.1 概述
算法永远不执行容器提供的操作
提供了超过100个算法
11.2 初窥算法
1) 头文件
#include<algorithm>
#include<numeric>
#include<iterator>//一般如果使用这样的东西:back_inserter
等等…..
2) 一些例子
find(vec.begin(),vec.end(),search_value);
find_first_of(vec1.begin(),vec1.end(), vec2.begin(),vec2.end());//在范围1中查找第一个与范围2匹配的元素
accumulate(vec.begin(),vec.end(),43);
fill(vec.begin(),vec.end(),0);
copy(list.begin(),list.end(),back_inserter(ivec));
replace(list.begin(),list.end(),0,43);//0-à43
去掉重复:
sort(vec.begin(),vec.end());
vector<string>::iterator
end_unique=unique(words.begin,words.end());
words.erase(end_unique,words.end());
统计字数少于6个的单词数:
bool GT6(const string&s)
{
return
s.size()>=6
}
vector<string> :: size_type wc=count_if(words.begin(),words.end(),GT6);
3) 一些心得
这些算法都是对迭代器进行操作,而不直接对容器本身进行添加和删除操作.如果想添加或者删除,那么合适的迭代器是一个很好的选择
11.3 再谈迭代器
1) 插入迭代器
back_inserter 使用push_back
front_inserter 使用 push_front 对象序列将以反序出现在目标容器中
inserter 使用的时候决定在哪插入 使用insert
例子1:
vector<int> vec;//注意这个时候没有初始化
fill_n(back_inserter(vec),10,0);
例子2:
list <int> :: iterator it =
find(list.begin(),list,end(),43);
replace_copy(ivec.begin(),ivec.end(),inserter(ilst,it),100,0);//注意这里inserter是两个参数
2) iostream 迭代器
istream_iterator 用于读取输入流
ostream_iterator 用于写输入流
构造函数:
istream_iterator<T> in(strm);//创建从输入流 strm读取T类型的对象
isteram_iterator<T> in;//istream_iterator对象的超出末端迭代器
ostream_iterator<T> in(strm);//写入strm
ostream_iterator<T> in(strm,delim);//创建从T类型输入到strm类型的对象,delim是分隔符,strm是以空字符结束的字符串数组
例子1,把cin读入的int直接保存如vec中.
istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;//这个东西就是一个空的,
while(in_iter != eof)
{
vec.push_back(*in_iter++);
}
这个程序可以重写成这个样子
istream_iterator <string>
in_iter(cin);
istream_iterator<int> eof;
vector<int> vec(in_iter,eof);//从in_iter到eof的意思…
例子2
ostream_iterator<string> out_iter(cout,”/n”);
istream_iterator<string> in_iter(cin),eof;
while(in_iter != eof)
{
*out_iter++=*in_iter++;
}