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

原文链接: https://www.cnblogs.com/lance-ehf/archive/2013/05/17/3083648.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88898

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午11:51
下一篇 2023年2月9日 下午11:51

相关推荐