笔记会持续更新,有错误的地方欢迎指正,谢谢!
动态数组
之前学到的那些动态内存分配,一次只能分配/释放一个对象,但某些应用需要一次为对象分配很多内存,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.youkuaiyun.com/billcyj/article/details/78065438 - shared_ptr允许多个指针指向同一个对象。
详细可见:http://blog.youkuaiyun.com/billcyj/article/details/78079808
书上讲得太好了,直接放图~