天天看点

C++ Primer 笔记+习题解答(九)

2015/2/10 更新:

今天管理员通知我标题不能写加号的问题解决了,结果我试了下,还是那破样子啊。

CSDN的MarkDown编辑器着实坑爹啊。昨晚加上今天已经被坑了两*次了。导致这篇博文是写的最烂的一篇了,而且没有任何心情去修改。

标题都没法写两个加号,导致我只能用CPP代替。

0.引言:

容器:一个容器就是一些特定类型对象的集合。

元素在顺序容器中的位置与其加入容器时的位置相对应。

关联容器:其中的元素位置 由相关联的关键字-值决定。

关联容器的分类:顺序和无序。

1.顺序容器概述:

1.顺序容器:

vector /list /deque /array /string /forward_list

共上述六种。

2.性能折中:

1.向容器添加或者删除元素的代价。

2.非顺序访问元素的代价。与之对应的是随机访问(常见的是下边)

上面两者决定了容器之间操作的差异。

示例:向量中没有push_front 操作。因为在vector这个容器中头插元素的代价比较高,所以考虑性能,干脆就取消这个操作,用insert 代替。

3.array 相关:

此处的array是C++11标准刚刚收录的。不是我们常见的内置类型数组。但是很多特性一致,比如固定的大小。

4.forward_list 相关:
同array类似,都是C++11 新增的容器类型。单向链表。

容器选择相关:

除非有更好的选择,否则是推荐使用vector。

2.容器库概览:

1.迭代器:
迭代器都定义递增运算符。有的容器未定义下标运算符,但是容器都定义了迭代器。
2.迭代器范围:

迭代器范围概念:此概念是标准库的基础。迭代器范围是由一对指向同一个容器的迭代器表示的范围。

左闭合区间:表示的范围是典型的左闭右开。

数学表示:[beg,end) 同数学中的定义一致。隐含的定义了beg<=end.

我们总可以通过反复递增到达end。

1.当beg==end时,范围为空。

2.beg!=end时,范围中至少有一个元素。

3.容器的类型成员:

已经使用过的类型: size_type /iterator /const_iterator .

类型别名: 可以在不了解容器中具体的元素类型的情况时使用。

元素类型: value_type .容器中元素的类型。

引用类型: reference ,引用类型。

示例:

vector<string>::difference_type count

;

//定义了一个count变量,类型为difference_type.

4.begin/end 成员:

当调用两个成员函数时会或者指向首元素和尾后元素的迭代器。

多个版本:带c表示cosnt,带r表示反向迭代器。其中c&&r可以组合使用。

5.容器的定义和初始化:

1.除array之外都有default Cstor .

2.只有顺序容器才接受大小参数,array除外。

初始化的方式:

1.直接将一个容器初始化为另一个容器的拷贝,类似于拷贝构造函数和拷贝初始化。array除外。

上面这种情况要注意,容器的类型以及元素的类型要匹配。

2.拷贝一对迭代器指定的范围。

此种情况下不要求容器类型匹配,只要求元素类型相互关联即可。

习题解答:

9.1—9.34:

在经历两次浏览器崩溃,但是CSDN没有自动保存的情况下,我彻底崩溃了。所以我决定让那份答案永远的消失.

9.35

区别:

1.size是当前容器中元素的个数。

2.capacity是容器在未重新分配内存的情况下所能容纳的最大数量。

9.36

无可能。因为capacity是动态分配的。

9.37

1.list的内存占用不是连续的。

2.array 的是固定大小的。

9.38

#include <vector>
#include <iostream>
#include <list>
using namespace std;
int main(){
    vector<int> ivec();
    cout << "ivec'size is " << ivec.size() << endl
        << "ivec'capacity is " << ivec.capacity() << endl;
    ivec.resize();
    cout << "ivec'size is " << ivec.size() << endl
        << "ivec'capacity is " << ivec.capacity() << endl;
    ivec.resize();
    cout << "ivec'size is " << ivec.size() << endl
        << "ivec'capacity is " << ivec.capacity() << endl;
    system("pause");
    return ;
}
           

9.39

终极目标是调整容器大小为512.

若读入的单词数量小于512,那么以空字符补齐即可。

若读入的单词数量大于512,那么截去后面多余的string.

9.40

答案可以参考9.39。

9.41

#include <vector>
#include<iostream>
#include <string>
using namespace std;
int main(){
    vector<char> cvec = { 'a', 'f', 'e', 'u' };
    string str(cvec.begin(), cvec.end());
    for (auto x : str)
        cout << x << " ";
    cout << endl;
    system("pause");
    return ;
}
           

9.42

**用

vector<string> svec

最好不过了。

9.43

总感觉这个题目出的比较怪。所以我决定跳过去。

9.44

难道你要我用KMP进行匹配?还是你想想用容器

vector<sting>

忘记告诉题目了。

9.45–9.449

略,字符串这里的题目暂时先放弃了。

9.50

求浮点数略。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
    vector<string> svec;
    string word;
    cout << "Enter strings " << endl;
    while (cin>>word){
        svec.push_back(word);
    }
    cout << "The sum is :";
    int sum = ;
    for (auto& x : svec){
        sum += stoi(x);
    }
    cout << sum << endl;
    system("pause");
    return ;
}
           

9.51–9.52

略。