您的位置:首页 > 编程语言 > C语言/C++

C++ primer 3rd 第十二章泛型算法 P480 书中例子

2010-08-26 13:11 295 查看
2010-08-26 13:06:35

书中练习,经过适当修改,可以运行.存在问题:1,函数对象不深,了解;2,iterator不甚了解;3,几个泛型的具体实现不清楚.

#include<vector>
#include<algorithm>
#include<iterator>
//标准C++之前的<iostream>语法
//#include<iostream.h>
#include<iostream>
#include<string>
using namespace std;

class GreaterThan{
public:
 GreaterThan(int sz=6):_size(sz){}
 int size(){return _size;}
 bool operator()(const string &s1)
 {return s1.size() > _size;}
private:
 int _size;
};
class PrintElem
{
public:
 PrintElem(int lineLen=8):_line_length(lineLen),_cnt(0){}
 void operator()(const string& elem)
 {
  ++_cnt;
  if(_cnt%_line_length==0)
  {cout<<'/n';}
  cout<<elem<<"";
 }
private:
 int _line_length;
 int _cnt;
};
class LessThan
{
public:
 bool operator()(const string&s1,
  const string&s2)
 {return s1.size()<s2.size();}
};
typedef vector<string>textwords;
void process_vocab(vector<textwords>* pvec)
{
 if(!pvec){
  //给出警告消息
  cout<<"未发现文本"<<endl;
  return;
 }
 vector<string>texts;
 vector<textwords>::iterator iter;
 for(iter=pvec->begin();iter!=pvec->end();++iter)
  copy((*iter).begin(),(*iter).end(),
  back_inserter(texts));
 //排序texts的元素
 sort(texts.begin(),texts.end());
 //ok,我们来看一看我们有什么
 for_each(texts.begin(),texts.end(),PrintElem());
 cout<<"/n/n";//只是分隔显示输出
 //删除重复元素
 vector<string>::iterator it;
 it=unique(texts.begin(),texts.end());
 texts.erase(it,texts.end());
 //ok,让我们来看一看现在我们有什么了
 for_each(texts.begin(),texts.end(),PrintElem());
 cout<<"/n/n";
 //根据缺省的长度6排序元素
 //stable_sort()保留相等元素的顺序
 stable_sort(texts.begin(),texts.end(),LessThan());
 for_each(texts.begin(),texts.end(),PrintElem());
 cout<<"/n/n";
 //计数长度大于6的字符串的个数
 int cnt=0;
 //count的过时格式——标准C++已经改变了它
 cnt=count_if(texts.begin(),texts.end(),GreaterThan());
 cout<<"Number of words greater than length six are"
  <<cnt<<endl;
 static string rw[]={"and","if","or","but","the"};
 vector<string>remove_words(rw,rw+5);
 vector<string>::iterator it2=remove_words.begin();
 for(;it2!=remove_words.end();++it2)
 {
  int cnt=0;
  //count的过时格式——标准C++已经改变了它
  cnt=count(texts.begin(),texts.end(),*it2);
  cout<<cnt<<"instances removed:"
   <<(*it2)<<endl;
  texts.erase(
   remove(texts.begin(),texts.end(),*it2),
   texts.end()
   );
 }
 cout<<"/n/n";
 for_each(texts.begin(),texts.end(),PrintElem());
}
//difference_type类型能够包含一个容器的两个iterator的减法结果
//——在这种情况下,是string vector的...
//通常,被缺省处理
typedef vector<string>::difference_type diff_type;
//标准C++之前的头文件语法
#include<fstream>
int main()
{
 vector<textwords>sample;
 vector<string>t1,t2;
 string t1fn,t2fn;
 //要求用户输入文件
 //实际中的程序应该做错误检查
 cout<<"text file#1:";cin>>t1fn;
 cout<<"text file#2:";cin>>t2fn;
 //打开文件
 ifstream infile1(t1fn.c_str());
 ifstream infile2(t2fn.c_str());
 //iterator的特殊形式
 //通常,diff_type被缺省提供
 istream_iterator<string>input_set1(infile1),eos;//修改
 istream_iterator<string>input_set2(infile2);//修改
 //iterator的特殊形式
 copy(input_set1,eos,back_inserter(t1));
 copy(input_set2,eos,back_inserter(t2));
 sample.push_back(t1);sample.push_back(t2);
 process_vocab(&sample);
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息