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
- C++ Primer复习和学习笔记 第十一章 泛型算法
- 泛型算法 - 1【C++ Primer 学习笔记 - 第十一章】
- 泛型算法 - 2【C++ Primer 学习笔记 - 第十一章】
- C++Primer学习笔记第十一章(11/18)泛型算法
- C++primer第五版第十一章学习笔记
- 【C++primer学习笔记】第11章 泛型算法
- C++primer 第十一章笔记 初稿
- c++primer学习笔记 - 容器和算法
- c primer plus 第十一章学习小结
- c++ primer 学习笔记-第十一章
- C++ Primer复习和学习笔记 第十六章 模板与泛型编程
- C++ Primer 4 第十一章 泛型算法
- C++ Primer 【第四版】第十一章 泛型算法
- c++ primer读书笔记-第十一章 泛型算法
- C++Primer学习笔记(11)泛型算法
- C++ Primer复习和学习笔记 第五章 表达式
- C++ Primer复习和学习笔记 第六章 语句
- C++ Primer复习和学习笔记 第七章 函数
- C# GMarkerGoogle 报错,找不到
- LR--系统瓶颈分析
- linux命令后台运行
- Java中的方法
- Java 8的default方法详解
- C++ Primer复习和学习笔记 第十一章 泛型算法
- 使用jsoup解析HTML之jsoup和HTML DOM简介
- APB_Timer模块DUT&Testbench实践
- DedeCMS首页arclist分页arcpagelist标签实例解析
- myeclipse的log提示
- C++ Primer复习和学习笔记 第十二章 类
- 线性时间排序 Sorting in linear time O(n)
- 几种序列化库
- ActiveX异步回调JavaScript