第十一章 泛型算法

    技术2024-06-21  66

    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_itereof的意思

     

    例子2

    ostream_iterator<string> out_iter(cout,”/n”);

    istream_iterator<string> in_iter(cin),eof;

    while(in_iter != eof)

    {

             *out_iter++=*in_iter++;

    }

     

    最新回复(0)