
C++primer学习笔记
文章平均质量分 80
记录了学习C++过程中的一些笔记,本栏目的文章都参考C++primer和阿西拜编程课:https://www.bilibili.com/video/BV1z64y1U7hs/?spm_id_from=333.337.search-card.all.click
橙某xx
这个作者很懒,什么都没留下…
展开
-
C++primer -继承与动态绑定
基类通常都应该定义一个虚析构函数,即使该函数不执行任何操作也应如此,原因:析构函数默认是非虚函数,那么当派生类绑定到基类指针时,delete该指针将会根据其静态类型,也就是基类类型的析构函数去析构对象,导致派生类的专有内容未被析构而内存泄漏。因此要显式将基类的析构函数定义为虚函数。原创 2024-04-20 20:51:16 · 822 阅读 · 0 评论 -
C++primer -拷贝控制
拷贝控制成员:类通过五种函数来控制拷贝、移动、赋值和销毁:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数若一个类未显式定义拷贝控制成员,编译器会自动生成合成版本;拷贝构造函数和拷贝赋值运算符的合成版本是将成员一 一拷贝;因此当对象的成员是指针,而该指针指向对象的动态内存资源,可能出现合成的版本只拷贝了指针,没有将指针所指对象拷贝。通常我们希望发生的是深拷贝,但合成拷贝函数中发生的是浅拷贝。如果是拷贝赋值,合成的版本不会清理拷贝源所指的动态内存,还存在着内存泄漏的风险。因此对于含有 指向原创 2024-03-10 04:40:39 · 428 阅读 · 1 评论 -
C++primer -动态数组与allocator类
释放动态数组使用delete[] p;delete[] p和delete p 的区别在于delete[] p会调用多次析构函数,而delete p只调用一次,但对于内置数据类型它们的效果一样,因为内置数据类型没有析构函数。shared_ptr未定义下标运算,并且不支持指针与整数的运算,所以使用shared_ptr管理动态数组,只能用sp.get()获取其内置指针后访问: *(sp.get()+2) = i;// 回收p指向的n个内存(创建时必须使用的是p、n),回收时内存中的对象必须已执行destroy。原创 2024-03-08 18:30:00 · 699 阅读 · 1 评论 -
C++primer -智能指针
动态分配的对象,在主动释放之前会一直存在。shared_ptr\ unique_ptr 智能指针会记录共享对象的指针数(包括它自己),当共享对象的指针数为0时,回收该对象。原创 2024-03-07 02:21:38 · 2166 阅读 · 0 评论 -
C++primer -关联容器-无序容器
无序容器通过哈希函数得到一个哈希值,依据哈希值将元素映射到桶,不同的哈希值对应不同的桶,但不同的元素关键字经过哈希函数可能得到同一哈希值。由关键字得到哈希值的效率是高的,因此对于在无序容器中查找某元素,依赖于在同一桶中查找元素的效率。桶平均元素阈值,容器试图维护的桶平均元素数量,当load_factor()的值超过max_load_factor()时,容器将调整桶的大小。无序容器是元素不按排序方式存储 的容器,无序容器使用哈希存储方式组织元素:按照对关键字使用哈希函数得到的值分配元素的地址。原创 2024-03-06 06:07:12 · 389 阅读 · 0 评论 -
C++primer -关联容器-map、set
关联容器基础类型为map和set,针对它们是否有序、关键字是否可重复又衍生出一些类型,默认map和set(不加前缀情况下)是有序且关键字不重复的。map、set前面可加前缀表示新的关联容器类型,前缀如下:multi-可重复关键字的、unordered-无序的例:multimap :可重复关键字的有序map 、unordered_multimap : 可重复关键字的无序map 、unordered_map: 不可重复关键字的无序map。原创 2024-03-05 21:31:34 · 1121 阅读 · 0 评论 -
C++primer -迭代器
inserter(c, p) : 接受一个容器的引用c和迭代器p,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到迭代器所指位置之前(执行的是insert)back_inserter(c) : 接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队尾(执行的是push_back)。front_inserter(c):接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队首(执行的是push_front)原创 2024-03-05 08:01:33 · 1053 阅读 · 0 评论 -
C++primer -lambda表达式与bind
若lambda表达式只有一条return语句,返回类型的声明:->return_type 可以被省略,但一旦lambda表达式有除return之外的语句,省略了返回类型的lambda表达式的返回类型将被编译器自动推断为void。是一个lambda表达式,返回类型是bool值,接收一个参数int i,从外部作用域捕获一个已存在的变量sz。捕获变量是外层作用域中,已存在的对象被作为同名参数传递到 lambda 函数体中使用,未声明在捕获列表中声明的、外层作用域中已存在的 变量名,会被编译器自动推断为捕获变量。原创 2024-02-27 02:38:17 · 1962 阅读 · 0 评论 -
C++primer -泛型算法
inserter(c, p) : 接受一个容器的引用c和迭代器p,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到迭代器所指位置之前(执行的是insert)back_inserter(c) : 接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队尾(执行的是push_back)。front_inserter(c):接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队首(执行的是push_front)原创 2024-02-22 02:11:05 · 1985 阅读 · 1 评论 -
C++ primer -IO库-fstream
每次写操作前,均定位到文件末尾,不会截断文件,需要将内容添加到文件末尾时,应添加该模式,例:ofstrm.open("文件名", ofstream::app) 或 ofstrm.open("文件名", ofstream::out | ofstream::app)对于fstream和sstream,它们继承了iostream,因此接口支持iostream时,也支持使用fstream和sstream。以上是处理char字符的类型,对于宽字符类型,有wfstream/wifstream/wofstream。原创 2024-02-19 03:28:09 · 347 阅读 · 1 评论 -
C++primer -额外的string操作
/ 用s2中的pos2及之后的len2个字符到s末尾,替换pos之后的len个字符 ,可省略pos2和len2,直接用s2替换,这条对b,e迭代器序列不适用。// 用字符数组cp的前n个字符, n默认值为cp长度,替换s中pos之后的len个字符或替换[b, e)所代表的字符。// 用n个值为t的字符替换pos之后的len个字符,也可以是替换[b, e)的内容。// 用迭代器序列包含的[b2, e2) 的字符替换原s中的[b, e)所对应的字符。// 用列表中的字符替换s中[b, e)所对应的字符。原创 2024-02-22 01:40:46 · 1003 阅读 · 1 评论 -
C++primer -容器转换模板:栈和队列
/ 创建一个指定底层实现类型为deque的priority_queue,其比较类型为less<int> , 即数字越大优先级越高;greater<int> 数字越小优先级越高 ,std::less<T>和std::greater<T>都以函数对象的方式定义在<function>头文件中。// 指定底层实现容器的初始化,初始化了一个用list实现的空队列, list与队列的元素类型必须相同。// 返回队首,即优先级最高的元素。原创 2024-02-22 02:06:54 · 393 阅读 · 1 评论 -
C++ primer -IO库-基础io
系统通常将这些对象与程序运行窗口关联,当我们使用cin时,将从程序运行的窗口读入,当我们向cout、cerr和clog写入数据时,将会写到同一个窗口。tie(ostream*) :设置istream或ostream对象关联的输出流,接受一个输出流的指针,若未给定输出流,返回当前关联的输出流指针,若未指定输出流也无关联的输出流,返回空指针。当一个输入流被关联到一个输出流时,任何输入流的读取数据操作都会刷新关联的输出流,标准库将cout和cin关联,因此cin >> ival 会导致cout的缓冲区被刷新。原创 2024-02-19 03:11:51 · 953 阅读 · 0 评论 -
C++ primer -容器都支持的操作
8、都支持在迭代器p所指位置删除和插入,insert插入和erase删除,除forward_list外,顺序容器都插入p之前(forward_list插入p之后)并返回插入元素位置的迭代器,erase删除p所指元素(forward_list删除p之后的第一个元素)并返回删除后第一个元素的迭代器;容器都支持迭代器(iterator):迭代器范围为[begin(), end()),迭代器都支持的操作:begin(), end()(注意循环条件必须是 iter!4、容器都支持列表初始化,列表中容器的元素;原创 2024-02-21 03:18:38 · 395 阅读 · 0 评论 -
C++ primer -顺序容器
6、若只在创建时需要在中间插入元素,且要求在使用时支持随机访问:可以先试试在vector尾部插入元素后,使用sort()将元素排序到中间位置,如果必须在中间插入,先使用list,再将list中的元素拷贝到vector中。reserve不改变原来的容器内容,即若n小于容器现有元素个数,容器大小不变,而当n大于容器现有元素个数时,容器大小依旧不变,只对所在的内存空间重新分配,扩容至至少为n。所有顺序容器都提供了快速顺序访问的能力,但在1、插入/删除元素的代价,2、非顺序访问元素的代价上有所牺牲。原创 2024-02-21 03:55:41 · 711 阅读 · 0 评论 -
C++ primer -IO库-sstream
因此istringstream对象的常用操作如下:使用getline读入一行到string对象line中,用line初始化一个istringstream对象record,对record使用>>运算符,将string内存中的对象按空格读出,实现了读入多行按空格分隔的内容。对于fstream和sstream,它们继承了iostream,因此接口支持iostream时,也支持使用fstream和sstream。// 创建了一个绑定到string对象s 的sstream对象。原创 2024-02-19 03:33:19 · 413 阅读 · 1 评论