C++ Primer 习题11.15分析

题目:
算法标准库定义了一个名为unique_copy的函数,其操作与unique类似,唯一的区别在于:前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列。编写程序,使用unique_copy将一个list对象中不重复的元素复制到一个空的vector容器中。

原有答案如下:

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
	int array[]={1,2,3,4,100,5,100};
	list<int> ilst(array,array+7);
	vector<int> ivec;
	//将list对象ilst不重复的元素复制到一个空vector对象ivec中
	unique_copy(ilst.begin(),ilst.end(),back_inserter(ivec));
	//输出vector容器
	for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
		cout<<*iter<<" ";
	cout<<endl;
	return 0;
}

结果如下图:

很明显,结果并没有去除重复元素,unique_copy()没有起作用。为什么呢?分析如下:

  1. unique_copy无法只拷贝ilst中所存在的惟一值,如上题,计划中的结果为“1 2 3 4 100 5”,实际的结果却是“1 2 3 4 100 5 100”。造成这种结果的原因是,unique_copy()只会去掉相邻重复元素,而我们的数据中重复数字100并没有相邻。解决方法是,在运用unique_copy之前增加sort排序函数。
  2. 不能对list器直接使用sort函数。因为sort函数只对随机迭代器有作用,而list的迭代器不是随机迭代器,其是可读可写遍历迭代器,故list提供了自己的sort()和sort(Cmp);。解决办法是,可将list容器更改为vector容器(当然这不符合题目要求)或者使用list排序函数。
更改后的源码如下:

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
	int array[7]={1,2,3,4,100,5,100};
	list<int> ilst(array,array+7);
	vector<int> ivec;
	ilst.sort();//使用list容器提供的自己的排序函数sort()
	            //在使用unique_copy()之前排序是必不可少的
	//将list对象ilst不重复的元素复制到一个空vector对象ivec中
	unique_copy(ilst.begin(),ilst.end(),back_inserter(ivec));
	//输出vector容器
	for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
		cout<<*iter<<'\t';
	cout<<endl;
	return 0;
}
结果如下图,这样就正确了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值