您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记第十二章-2-动态数组 And 文本查询程序

2017-09-26 11:27 381 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

动态数组

之前学到的那些动态内存分配,一次只能分配/释放一个对象,但某些应用需要一次为对象分配很多内存,C++语言定义了另一种new表达式语法,可以分配并初始化一个对象数组。

虽然接下来要介绍动态数组,但一般情况下还是推荐使用容器。因为:使用容器的类可以使用默认版本的拷贝、赋值和析构操作;而分配动态数组的类必须自定义这些。蛋疼

初始化动态数组

可用空括号或花括号对数组初始化,但不能在括号中出现初始化器,所以不能用auto。

string *psa2 = new string[10](); //10个空string
string *psa3 = new string[10]{"a", "b", string(3, 'c')}; //前三个定了,后面默认初始化。


释放动态数组

为了释放动态数组,我们要在delete和指针之间加一个方括号。否则会没有警告但行为异常。

delete [] pa; //pa必须指向一个动态分配的数组或pa为空。
delete p; //p必须指向一个动态分配的对象或p为空。


有一些灵活性的局限:

new将内存分配和对象构造放在一起;

delete将对象析构和内存释放放在一起。

在分配单个对象时,通常希望将内存分配和对象初始化放在一起,因为我们一般是知道对象有什么值才去给它分配内存的。

但是,在分配一大块内存时,情况就有些不同了,我们希望将内存分配和对象构造分离,就是说,我们先分配大块内存,在真正需要时才执行对象创建操作。

了解即可:allocate可分配一定大小的原始未构造的内存。

使用标准库实现 文本查询程序

这是一个很好用的程序,可作为标准库相关内容学习的总结。

程序功能:

允许用户在一个给定的文件中查询单词,查询的结果是单词在文件中出现的次数,还有这些单词所在行的列表。如果一个单词在一行中出现多次,此行只列出一次,行会按照升序输出。

举例:

输入:

给定文件为“本章C++ Primer英文版内容”,单词为“element”。

输出:

element occurs 112 times

(line 36) A set elements contains only a key;

(lin 158) operator creates a new element

此处省略剩下的大约100行。这些行都是单词element出现的位置。

实现:

概念补充:

map使用键值对的方式来储存数据,键不能有重复的,值可以重复,map使用键来存储数据,系统会根据键来自动将数据排序;set键不能有重复,使用键来存储数据,系统会根据该值来自动将数据排序。

详细可见:http://blog.csdn.net/billcyj/article/details/78065438

shared_ptr允许多个指针指向同一个对象。

详细可见:http://blog.csdn.net/billcyj/article/details/78079808

书上讲得太好了,直接放图~











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c++primer 读书笔记