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





#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++;//这里读出了从控制台中输入的第一行string

	while (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值