C++Primer第五版——习题答案详解(九)

时间:2022-11-11 00:14:47

习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html

第10章 泛型算法


练习10.1

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main() {
    int t, n;
    vector<int> vec;
    cout << "请输入序列个数:" << endl;
    cin >> n;
    cout << "请输入序列:" << endl;
    for (int i = 0;i < n;i++) {
        cin >> t;
        vec.push_back(t);
    }
    cout << "请输入要统计的值:" << endl;
    int num;
    cin >> num;
    cout << count(vec.begin(), vec.end(), num) << endl;
    

    system("pause");
    return 0;
}

练习10.2

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

using namespace std;

int main() {
    int n;
    string t;
    list<string> lst;
    cout << "请输入字符串个数:" << endl;
    cin >> n;
    cout << "请输入" << n << "个字符串:" << endl;
    for (int i = 0;i < n;i++) {
        cin >> t;
        lst.push_back(t);
    }
    cout << "请输入要统计的字符串:" << endl;
    string num;
    cin >> num;
    cout << count(lst.begin(), lst.end(), num) << endl;

    system("pause");
    return 0;
}

练习10.3

#include<iostream>
#include<numeric>
#include<vector>

using namespace std;

int main() {
    vector<int> vec = { 1,2,3,4,5 };
    int sum = accumulate(vec.begin(), vec.end(), 0);
    cout << sum << endl;
    return 0;
}

练习10.4
初始值设为0表示返回值为int类型,会有精度损失

练习10.5
equal会比较指针地址,而不是字符串值,比较的结果与string类型的不一致。

练习10.6

fill_n(vec.begin(),vec.size(),0);

练习10.7
a.lst和vec之间的大小未保证相同,vec.resize(lst.size)
b.vec.resize(10);

练习10.9

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

void elimDups(vector<string> &words) {
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());
    cout << "unique后:";
    for (auto i : words) {
        cout << i << " ";
    }
    cout << endl;
    cout << "erase后:";
    words.erase(end_unique, words.end());
    for (auto i : words) {
        cout << i << " ";
    }
    cout << endl;
}

int main() {
    vector<string> words = { "abc","abc","abc","bcd","efg","bcd","eqd" };
    elimDups(words);
    system("pause");
    return 0;
}

练习10.10
标准库算法对迭代器而不是容器进行操作。

练习10.11

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

bool isShorter(const string &s1, const string &s2) {
    return s1.size() < s2.size();
}

void elimDups(vector<string> &words) {
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());
    words.erase(end_unique, words.end());
}

int main() {
    vector<string> words = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };
    elimDups(words);
    stable_sort(words.begin(), words.end(), isShorter);
    for (auto &i : words) {
        cout << i << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}

练习10.12

bool compareIsbn(const Sales_data &a, const Sales_data &b) {
        return a.isbn() < b.isbn();
}

练习10.13

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

bool cmp(const string &a) {
    return a.size() >= 5;
}

int main() {
    vector<string> words = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };
    partition(words.begin(), words.end(), cmp);
    for (auto &i : words) {
        cout << i << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}

练习10.14

#include<iostream>
using namespace std;
int main() {
    auto f = [](int a,int b) {return a + b;};
    cout << f(1, 2) << endl;
    return 0;
}

练习10.15

#include<iostream>
using namespace std;

int main() {
    int a = 1;
    auto f = [a](int b) {return a + b;};
    cout << f(2) << endl;
    
    system("pause");
    return 0;
}

练习10.16

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> &elimDups(vector<string> &words)
{
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());
    words.erase(end_unique, words.end());
    return words;
}

void biggies(vector<string> &words, vector<string>::size_type sz)
{
    elimDups(words);
    stable_sort(words.begin(), words.end(),
        [](const string &a, const string &b)
            { return a.size() < b.size(); });
    auto wc = find_if(words.begin(), words.end(),
        [sz](const string &a)
            { return a.size() >= sz; });
    auto count = words.end() - wc;
    cout << count << endl;
    for(const auto s : words)
        cout << s << " ";
    cout << endl;
}

int main()
{
    vector<string> vs = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };

    biggies(vs, 5);

    return 0;
}

练习 10.18-10.19

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> &elimDups(vector<string> &words)
{
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());
    words.erase(end_unique, words.end());
    return words;
}

void biggies(vector<string> &words, vector<string>::size_type sz)
{
    elimDups(words);
    auto wc = partition(words.begin(), words.end(),
        [sz](const string &a)
    { return a.size() >= sz; });
    
//auto wc = stable_partition(words.begin(), words.end(),
//[sz](const string &a)
//{ return a.size() >= sz; });

    auto count = words.end() - wc;
    cout << count << endl;
    for (const auto s : words)
        cout << s << " ";
    cout << endl;
}

int main()
{
    vector<string> vs = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };

    biggies(vs, 5);
    system("pause");
    return 0;
}

练习10.20

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<string> words = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };
    string::size_type sz = 6;
    auto wc = count_if(words.begin(), words.end(),
        [sz](const string &a)
    { return a.size() >= sz; });
    cout << wc << endl;
    system("pause");
    return 0;
}

练习10.21

#include<iostream>
#include<algorithm>

using namespace std;

int main() {
    int v = 5;
    auto f = [&v]()->bool
    {
        if (v <= 0) return false;
        else {
            --v;
            return true;
        }
    };
    while (f()) {
        cout << v << endl;
    }
    system("pause");
    return 0;
}

练习10.22

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<functional>

using namespace std;

bool judge_size(string &s, string::size_type sz) {
    return s.size() >= sz;
}

int main() {
    vector<string> words = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };
    cout << count_if(words.begin(), words.end(), bind(judge_size, placeholders::_1, 6)) << endl;

    system("pause");
    return 0;
}

练习10.23

假设要绑定的函数有n个参数,绑定取n + 1个参数。另外一个是函数本身的绑定。

练习10.24

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;
bool check_size(string &s, int sz)
{
    return s.size() < sz;
}

int main()
{
    vector<int> vi = { 1,2,3,4,5,6 };
    string s("aaaa");

    auto iter = find_if(vi.begin(), vi.end(), bind(check_size, s, placeholders::_1));

    cout << *iter << endl;
    system("pause");
    return 0;
}

练习10.25

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

vector<string> &elimDups(vector<string> &words)
{
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());
    words.erase(end_unique, words.end());
    return words;
}

bool check_size(const string &s, string::size_type sz)
{
    return s.size() >= sz;
}

int main()
{
    vector<string> vs = { "the","quick","red","fox","jumps","over","the","slow","red","turtle" };

    auto iter = partition(vs.begin(), vs.end(), bind(check_size, placeholders::_1, 5));
    for (const auto s : vs)
        cout << s << " ";
    cout << endl;

    vs.erase(iter, vs.end());
    for (const auto s : vs)
        cout << s << " ";
    cout << endl;
    system("pause");
    return 0;
}

后续部分之后再更新。。