C/C++教程

《C++ Primer》第10章 10.6节习题答案

本文主要是介绍《C++ Primer》第10章 10.6节习题答案,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

《C++ Primer》第10章 泛型算法

10.6节特定容器算法 习题答案

练习10.42:使用list代替vector重新实现10.2.3节(第343页)中的去除重复单词的程序。

【出题思路】

练习链表的特殊操作。

【解答】

本题要使用链表专用的sort和unique算法,与泛型算法的不同点有如下两点:

1.它们是以链表类的成员函数形式实现的,因此使用方式是在链表对象上调用它们,也并不需要迭代器参数指出处理的序列。

2.由于是以成员函数形式实现的,是直接操作容器而非通过迭代器访问容器元素,因此这些算法具有修改容器的能力(添加、删除元素)。例如,unique会调用erase直接真正删除重复元素,容器的大小会变小,而不是像泛型unique算法那样只是覆盖重复元素,并不改变容器大小。因此程序已不再需要调用erase了。

建议读者好好体会泛型算法和专用算法之间的差异,包括上述使用方式上的差异,以及从库的开发者的角度思考两种方式的差异。

#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <algorithm>

using namespace std;

inline void output_words(list<string> &words)
{
    for(auto iter = words.begin(); iter != words.end(); iter++)
        cout << *iter << " ";
    cout << endl;
}


void elimDups(list<string> &words)
{
    output_words(words);
    words.sort();
    output_words(words);
    
    words.unique();
    output_words(words);
}


int main(int argc, const char *argv[])
{
    ifstream in(argv[1]);
    if(!in)
    {
        cout << "打开输入文件失败!" << endl;
        exit(1);
    }
    
    list<string> words;
    string word;
    while(in >> word)
        words.push_back(word);
    
    elimDups(words);
       
    return 0;
}

data10_42.txt文件内容为:

the quick red fox jumps over the the slow over red turtle

设置命令行参数

运行结果:

这篇关于《C++ Primer》第10章 10.6节习题答案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!