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

    

posted on 2013-05-17 14:39  次奥砖家  阅读(152)  评论(0编辑  收藏  举报

导航