C++ Primer复习和学习笔记 第十一章 泛型算法

来源:互联网 发布:中国研究数据服务平台 编辑:程序博客网 时间:2024/05/16 18:14





#include "main.h"//《C++ primer》  343页面的   这个程序的作用是:(1)去掉所有重复的单词(2)按单词的长度排序(3)统计长度等于或超过6个字母的单词个数。bool isShorter(const string &s1,const string &s2){return s1.size()<s2.size();}bool GT6(const string &s){return s.size()>=6;}string make_plural(size_t ctr,const string &word,const string &ending){return (ctr==1)?word:word+ending;}int main(){vector<string>  words;string next_word;while (cin>>next_word){words.push_back(next_word);}cout<<"原始的输入数据"<<endl;for (vector<string>::iterator iter=words.begin();iter!=words.end();++iter){cout<<*iter<<" ";}cout<<endl;sort(words.begin(),words.end());//排序算法cout<<"sort()函数排序后的数据"<<endl;for (vector<string>::iterator iter=words.begin();iter!=words.end();++iter){cout<<*iter<<" ";}cout<<endl;vector<string>::iterator end_unique=unique(words.begin(),words.end());//去掉重复的元素/**********************************************************************************************************************//*  这里输出的经过unique()函数运算的vector<string>中的元素和《c++ primer》中显示的不一样,缺少了最后一个元素        */    /*********************************************************************************************************************/cout<<"unique()函数排序后的数据"<<endl;for (vector<string>::iterator iter=words.begin();iter!=words.end();++iter){cout<<*iter<<" ";}cout<<endl;words.erase(end_unique,words.end());//擦除掉vector中最后的元素cout<<"erase()函数排序后的数据"<<endl;for (vector<string>::iterator iter=words.begin();iter!=words.end();++iter){cout<<*iter<<" ";}cout<<endl;stable_sort(words.begin(),words.end(),isShorter);//排序之后是按照string的长度进行排序的。而不是按照字母次序排序的。cout<<"stable_sort()函数排序后的数据"<<endl;for (vector<string>::iterator iter=words.begin();iter!=words.end();++iter){cout<<*iter<<" ";}cout<<endl;vector<string>::size_type wc = count_if(words.begin(),words.end(),GT6);cout<<wc<<" "<<make_plural(wc,"word","s")<<"6 characters or longer "<<endl;return 0;}

算法标准库定义了一个名为unique_copy的函数,其操作类似于unique。
唯一的区别在于:前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列。
unique_copy根据字面意思就是去除重复元素再执行copy运算。

unique_copy与unique的唯一区别在于:unique_copy会将进行删除【相邻重复元素】的结果 保存在另外一个结果容器中。

函数参数:unique_copy(first,last,result,compare);//first为容器的首迭代器,last为容器的末迭代器,result为保存结果的容器(原容器的内容不变),

compare为比较函数(可略写)。

注意删除掉的是【相邻重复元素】。如果重复元素是不相邻的。那么就不会被删除掉。


编写程序使用unique_copy将一个list对象中不重复的元素赋值到一个空的vector对象中。

【注意如果想要让vector中没有重复的元素,那么就需要对原来的list进行排序,如果不进行排序,那么存放到vector中的元素还是和没有经过unique_copy()函数调用的一样】

//使用unique_copy算法//将一个list对象中不重复的元素赋值到一个空的vector对象中#include<iostream>#include<list>#include<vector>#include<algorithm>using namespace std;int main(){    int ia[7] = {5 , 2 , 2 , 2 , 100 , 5 , 2};    list<int> ilst(ia , ia + 7);    vector<int> ivec;    //将list对象ilst中不重复的元素复制到空的vector对象ivec中    //sort(ilst.begin() , ilst.end());  //不能用此种排序,会报错    ilst.sort();  //在进行复制之前要先排序,切记    unique_copy(ilst.begin() , ilst.end() , back_inserter(ivec));    //输出vector容器    cout<<"vector: "<<endl;    for(vector<int>::iterator iter = ivec.begin() ; iter != ivec.end() ; ++iter)        cout<<*iter<<" ";    cout<<endl;    return 0;}

#include "D:\C++WORK\main.h"//关于  istream_iterator 的使用方式。很有趣的程序int main(){istream_iterator<int>    in_iter(cin);istream_iterator<int>  eof;vector<int>   ivec(in_iter,eof);//这句话更有趣,这样的一句代码就等于下面的12-18行所有的代码/*绑定在流上的迭代器在遇到文件结束或某个错误的时,将等于结束迭代器的值。那么这个时候in_iter==eof这样输入循环将会结束。*//*vector<int>   ivec;while (in_iter!=eof){ivec.push_back(*in_iter++);}*/for (vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter){cout<<*iter<<" ";}return 0;}

#include "D:\C++WORK\main.h"int main(){//ostream_iterator的使用方式ostream_iterator<string>  out_iter(cout,"-----");istream_iterator<string>  in_iter(cin),eof;while(in_iter!=eof){*out_iter++ = *in_iter++;/**out_iter=*in_iter;++out_iter;++in_iter;*/}return 0;}

int  main()//351页的源代码{istream_iterator<Sales_item>  item_iter(cin),eof;Sales_item   sum;//这个是一个空的Sales_item类型的对象。sum=*item_iter++;//这里读出了从控制台中输入的第一行stringwhile (item_iter!=eof){if (item_iter->same_isbn(sum))//判断当前读入的东西和前一个是否是相同类型{sum=sum+*item_iter;} else{//如果不相等那么,就把当前的新的类型保存到sum中。cout<<sum<<endl;sum=*item_iter;}++item_iter;}cout<<sum<<endl;//输出最后的记录。return  0;}

#include "D:\C++WORK\main.h"int  main(){istream_iterator<int>  cin_it(cin),end_of_stream;//输入流迭代器vector<int>  ivec(cin_it,end_of_stream);//读入一系列的int类型的数据,保存到vector中。sort(ivec.begin(),ivec.end());//排序ostream_iterator<int>  output(cout," ");//输入流迭代器unique_copy(ivec.begin(),ivec.end(),output);//执行unique_copy()操作,最后一个操作数是,输出流迭代器。return  0;}

#include "D:\C++WORK\main.h"//从文件中读取内容,然后输出输出到控制台。int  main(){cout<<"请输入文件名字:"<<endl;string fileName;cin>>fileName;ifstream ioFile(fileName.c_str());if (!ioFile){cout<<"打开文件文件失败!"<<endl;return -1;}istream_iterator<string>  in_iter(ioFile),eof;//注意这里不在是cin了,而是ioFile这个ifstream类型的文件流。ostream_iterator<string>  output(cout," ");copy(in_iter,eof,output);ioFile.close();return  0;}


#include "D:\C++WORK\main.h"//从控制台输入一列的整数,奇数写入文件,用空格隔开,偶数写入另外的文件,用换行符隔开。int  main(){fstream  evenFile("C:\\11.txt");//偶数保存文件fstream  oddFile("C:\\22.txt");//奇数保存文件if (!evenFile||!oddFile){cout<<"打开文件失败"<<endl;}istream_iterator<int>  in_iter(cin),eof;ostream_iterator<int>  output_even(evenFile,"\n");ostream_iterator<int>  output_odd(oddFile," ");while (in_iter!=eof){if ((*in_iter)%2==0){//偶数的情况下*output_even=*in_iter;//想使用copy(in_iter,in_iter,output_even);但是文件中无数据++output_even;} else{//奇数的情况下*output_odd=*in_iter;//想使用copy(in_iter,in_iter,output_odd);但是文件中无数据++output_odd;}++in_iter;}oddFile.close();evenFile.close();return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 轻轨少买了一站怎么办 高铁火车票丢了怎么办 如果高铁票丢了怎么办 高铁票丢了怎么办 报销 高铁如果没赶上怎么办 高铁管家待核验怎么办 动车没有票了怎么办 12306取消订单3次怎么办 【12306取消订单3次怎么办】 火车票取消订单3次怎么办 12306收不到验证码怎么办 安逸花验证码次数限制怎么办 航班晚点导致错过转机怎么办 想去沈阳站送站怎么办 高铁没有赶上车怎么办 火车晚点赶不上下一趟车怎么办 列车晚点影响下一趟车怎么办? 高铁晚点赶不上下班车怎么办 火车在半路坏了怎么办 做火车中途坏了怎么办 员工怀孕不上班保险怎么办 怀孕带孩子不能上班保险怎么办 怀孕了不想上班保险怎么办 高铁票没票了怎么办 购买动车票无座怎么办 个税工资多报怎么办 火车晚点耽误了转车怎么办 坐火车联系不上怎么办 号码被别人注册了12306怎么办 注册12306的号码换了怎么办 12306号码被注册了怎么办 12306身份证被注册了怎么办 12306被别人注册了怎么办 铁路1236注册名忘记了怎么办 12306手机被别人注册了怎么办 12306注册手机不用了怎么办 到站后火车票掉了怎么办 在手机上买了票怎么办 智行火车票抢不到票怎么办 高铁买票票丢了怎么办 异地恋房费太贵怎么办