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

来源:互联网 发布:白糖期货软件 编辑:程序博客网 时间:2024/05/18 03:17

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(10);    cout << "ivec'size is " << ivec.size() << endl        << "ivec'capacity is " << ivec.capacity() << endl;    ivec.resize(50);    cout << "ivec'size is " << ivec.size() << endl        << "ivec'capacity is " << ivec.capacity() << endl;    ivec.resize(100);    cout << "ivec'size is " << ivec.size() << endl        << "ivec'capacity is " << ivec.capacity() << endl;    system("pause");    return 0;}

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 0;}

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 = 0;    for (auto& x : svec){        sum += stoi(x);    }    cout << sum << endl;    system("pause");    return 0;}

9.51–9.52

略。

0 1
原创粉丝点击