C++ Primer中,Exercise11.15答案运用unique_copy无效
题目是这样的:
编写程序,使用unique_copy将一个容器对象中的元素拷贝到一个空的vector容器中。(题目有微调。解决原题目中的list排序问题可以使用list自身所带的sort函数,而不使用generic algorithm中的sort函数。)
原有答案如下:
#include <iostream> #include <list> #include <vector> #include <algorithm> using namespace std; int main() { int ia[] = {1, 2, 3, 4, 100, 5, 100}; list<int> ilst(ia, ia+7); vector<int> ivec; unique_copy(ilst.begin(), ilst.end(), back_inserter(ivec)); cout << "vector:" << endl; for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) cout << *iter << " "; cout << endl; return 0; }
这个答案出现的结果是有误的,其原因主要有两点:
(1)unique_copy无法只拷贝ilst中所存在的惟一值,如上题,计划中的结果为“1 2 3 4 100 5”,实际的结果却是“1 2 3 4 100 5 100”。造成这种结果的原因是,没有将ilst中的值进行排序。解决方法是,在运用unique_copy之前增加sort排序函数。
(2)不能对list器使用sort函数。因为sort函数只对随机迭代器有作用,而list的迭代器不是随机迭代器,其是可读可写遍历迭代器。解决办法是,可将list容器更改为vector容器。
更改后的源码如下,可以正常实现题目所列的要求:
#include <iostream> #include <list> #include <vector> #include <algorithm> using namespace std; int main() { int ia[] = {1, 2, 3, 4, 100, 5, 100}; vector<int> ilst(ia, ia+7); vector<int> ivec; sort(ilst.begin(), ilst.end()); unique_copy(ilst.begin(), ilst.end(), back_inserter(ivec)); cout << "vector:" << endl; for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) cout << *iter << " "; cout << endl; return 0; }
参考文档:http://bbs.csdn.net/topics/340149233