CPP Primer 笔记 习题解答(九)

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

略。

时间: 2024-10-31 17:38:23

CPP Primer 笔记 习题解答(九)的相关文章

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 3

Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的实现做出了性能上的要求,所以,在一般的应用场合,标准库类型都有足够的效率. 2. 当用一个字符串字面值初始化string对象时,除了最后那个空字符外其他所有的字符都会被拷贝到新创建的string对象中去. 3. 如果使用等号初始化一个变量,实际上执行的是拷贝初始化.如果不使用等号,则执行的是直接初始

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 1

Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类型.函数名.形参列表以及函数体. 3. 当return语句包含一个值时,此返回值的类型必须与函数的返回类型相兼容. 4. 类型是程序设计最基本的概念之一.一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算. Chapter 1.2 1. C++包含了一个全面的标准库,标准库就是一个类

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 2

Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.void无值也无操作,我们不能定义一个void类型的变量. 3. 算术类型的尺寸,也就是该类型所占的比特数,在不同机器上有所差别.下表列出了C++标准规定的最小尺寸,同时允许编译器赋予这些类型更大的尺寸: 由于比特数的不同,一个类型所能表达的最大(最小)值也是不同的. 4. C++语言规定,一个int至

《C++primer》v5 第5章 语句 读书笔记 习题答案

5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了. 5.4 (a)每次迭代时候会初始化iter,但是iter缺少初值,所以这段代码根本不会通过编译.另外这里的括号需要一个bool类型的,而定义迭代器根本不会返回一个bool类型.假如上面那些问题都可以通过,每次迭代都会初始化这个iter,会导致死循环. (b)我试了一下编译未通过是因为没找到适合的find函

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

《C++primer》v5 第1章 开始 读书笔记 习题答案

从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和cout分别是istream和ostream的对象. #include<iostream> using namespace std; int main() { cout<<"Hello,world"<<endl; return 0; } 1.4 #incl

《C++primer》v5 第4章 表达式 读书笔记 习题答案

4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略? 4.4 (12/3*4)+(5*15)+(24%4/2)=91 4.5 (a)-86(b)-16 (c)0 (d)0 4.6 n%2 4.7 溢出:计算结果超出该数据类型所能表示的范围 2147483647+1 1U-2 ... 4.8 比较低.. 4.9 首先判断cp是否为空指针,若非空指针则

《C++primer》v5 第2章 C++基础 读书笔记 习题答案

2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节,double是双精度,一般占用8个字节,它们可表示的数据范围也不相同. 2.2 利率用double,本金和付款用int 2.3 unsigned u=10,u2=42; cout<<u2-u<<endl; cout<<u-u2<<endl; int i=10,

C++Primer第五版习题解答---第一章

C++Primer第五版习题解答---第一章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2022/1/7 第一章:开始 练习1.3 #include<iostream> int main() { std::cout << "hello, world" << std::endl; return 0; } 练习1.4: #include<iostream> int main() { int