- 博客(52)
- 收藏
- 关注
原创 Linux杂项知识2
线程安全是为了确保多线程访问共享资源时,程序的行为和结果是可预期的。通过使用同步机制(如互斥锁、读写锁、原子操作等),我们可以防止竞态条件、数据不一致和其他多线程并发问题。
2024-09-13 19:47:49 514
原创 C++ IO流
头文件提供的一个非常有用的类,它允许字符串对象像流(stream)一样被操作。是 C++ 中用于输出文件操作的一个类,它可以创建新文件用于写入或者向已存在的文件写入数据。:这是最常用的向文件写入数据的方法。对象时,可以通过第二个参数指定文件打开的模式,例如仅读、仅写、读写等。成员函数获取流当前的字符串值,或者将一个新的字符串值分配给流。是 C++ 中处理文件输入输出操作的一个类,属于标准库中的。对象被销毁时自动关闭,但显式关闭文件是一个好习惯。头文件中定义的一部分,是用于处理文件输出流的。
2024-05-17 15:36:52 1058
原创 C++ 特殊类设计
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个。就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。构造函数私有化,派生类调不到基类的构造函数,无法继承。访问它的全局访问点,该实例被所有程序模块共享。只能创建一个对象的类(单例模式)
2024-05-17 14:47:32 321
原创 C++ 智能指针
循环引用是指两个或多个对象之间形成了一个引用循环,从而导致它们不能被正常回收释放,这通常出现在使用智能指针进行内存管理时。特别是在使用。
2024-05-17 14:09:37 673
原创 C++ 类型转换
C++中有四种强制类型转换(Cast)运算符,每种转换运算符在不同场景下有不同用途,了解它们的特点有助于选择最合适的转换方式。是最常用的类型转换操作,用于在相关类型之间进行转换,例如将float转换为int。它也可用于类层次结构中基类和子类之间的转换,但只限于没有虚函数的情况下,即不涉及多态。在编译时检查转换的有效性,如果转换不合法,则会报编译错误。: 通用类型转换,数值类型之间、指针类型之间、基类和子类之间的转换。
2024-05-17 12:22:02 941
原创 C++ 异常
C语言很多标准库函数在遇到错误时都会返回一个特定的错误码或NULL,通过这个错误码来判断错误信息。C语言在<errno.h>头文件中定义了一个名为errno的全局变量,它在系统调用和某些库函数遇到错误时被设置成一个错误码,以指示具体的错误类型。errno的值是整数,每个值对应不同的错误。通过检查errno的值,可以得知错误的具体原因。通常,执行一个系统级函数或库函数之后,立即检查errno来判断是否发生了错误。
2024-05-17 10:02:30 556
原创 C++ 继承
在实际的编程实践中,“优先使用组合而非继承”是一个通常的设计原则。这种做法能够最小化类之间的耦合,提高代码的复用性和可维护性。当然,这并不是说继承是有害的,恰当的使用继承能够带来很多便利。但是我们需要清楚,在什么情况下使用继承,什么情况下使用组合,这对于我们来说是非常重要的。
2024-05-16 11:27:20 689
原创 C++ STL概念之 仿函数(函数对象)/ 空间配置器 / 适配器 / 理解STL
仿函数,或称为函数对象,在C++中是通过重载operator()的类实例,使得类的实例能够像函数一样被调用。
2024-05-16 07:58:10 772 1
原创 C++ STL概念之 算法
这个版本允许用户指定一个自定义比较函数或函数对象comp,而不是使用默认的操作符。这使得用户可以定义更复杂的排序逻辑。比如,可以根据元素的某个特定字段进行查找,或使用不同于默认的比较规则。这个版本允许用户通过comp参数提供一个自定义的比较函数,以便在比较元素时使用。这让用户可以自定义元素比较的规则,而不是仅依赖于元素类型的操作符。如果元素类型是自定义的,或者需要按不同于默认操作符的方式来比较元素,这个版本就特别有用。这个版本与默认版本相似,但给用户提供了一个comp。
2024-05-15 22:53:11 1121
原创 C++ STL概念之 迭代器
迭代器失效,顾名思义,就是迭代器无效的情况。如果一个迭代器无法正确引用一个元素(比如元素已经被删除)或者迭代器的行为无法预知(如在迭代的过程中容器发生改变),我们就说这个迭代器已经失效。
2024-05-15 15:46:50 548
原创 C++ STL概念之 序列式容器4(bitset / array / forward_list / deque)
用于序列中的一位或所有位设置为1。这个版本将位序列中的所有位都设为1。这个版本能够设置位序列中的指定位。参数pos为我们想要设置的位的位置,参数val是设定的值,如果不提供val参数,默认将位设置为1。如果提供了val参数并且其值为false,则将指定位设为0。
2024-05-15 15:02:20 830
原创 C++ STL概念之 序列式容器3(string)
=运算符接受右侧的字符串,并将其内容附加到左侧字符串的末尾。左侧的字符串需要是一个对象,而右侧可以是对象、字符数组、字面量字符串或单个字符。使用+=运算符进行字符串连接的操作比使用运算符更高效,因为它避免了不必要的临时字符串对象的创建。+=+=+=+=
2024-05-15 14:32:45 691
原创 C++ STL概念之 序列式容器2(stack / queue / priority_queue)
***这个版本的push方法接受一个对现有对象的常量引用作为参数。它是传统的推入方法,适合在你已经有一个对象,并想要将其加入到栈中时使用。在这个方法中,传入的参数val被视为一个左值,意味着在推入栈之前,会发生一次复制操作。这是因为栈管理其内容的副本,而不是直接管理原始对象。****这个版本的push方法接受一个右值引用作为参数,允许使用移动语义。如果你有一个即将销毁的临时对象,或者你希望将一个对象转移进栈中以避免复制开销,这个方法更合适。
2024-05-15 11:50:32 626
原创 C++ STL概念之 序列式容器1(vector / list)
push_back有两种重载方式一、 参数是一个vector 存储类型的元素二、 参数是一个vector 存储类型的右值元素,是右值类型的重载版本,用于向容器移动右值(临时对象),而不是复制。
2024-05-15 11:00:31 650
原创 C++ STL概念之 关联式容器2(unordered_map/unordered_set)
(2):这是一个移动插入,P是哈希map的的键值对类型, P&&是一个右值类型,可以将临时对象或可移动的对象传给insert。这对于性能优化很有用,因为它允许通过避免复制键来直接构造或移动键,在某些情况下这可以减少内存分配。(1):允许使用一个mapvalue类型(哈希map的键值对)的参数向哈希map中插入元素。哈希set和哈希map都是这些方法,但是哈希set的右值引用版本的类型是value(key)是一个常量引用,表示要访问或插入的键。是一个右值引用,表示要访问或插入的键。当你想要根据一个给定的键(
2024-05-13 19:51:10 794
原创 C++ STL 概念之 关联式容器1(map/set)
STL,全称Standard Template Library(标准模板库),是C++标准库的重要组成部分。从容器开始逐个描述。
2024-05-06 23:10:28 472 2
原创 C++类和对象3
三、尽量使用初始化列表对成员进行初始化:1、对于内置类型,使用初始化列表没影响2、对于自定义类型,使用初始化列表可以提高效率 ,因为初始化列表在许多情况下允许直接初始化成员变量,而不是先默认初始化再赋值。这样可以省去不必要的构造和析构的过程,直接构造为目标值省去了中间步骤。四、
2024-05-04 23:20:35 176
原创 C++基础概念1
命名空间就是定义了一个作用域,在这个作用域的所有内容都局限于这个命名空间中。命名空间可以在另一个命名空间之中嵌套声明,但不能声明在类和代码块中。
2024-04-29 22:57:08 254
原创 快速排序及其实现
用tem和cur标定比基准值小的和目前的排序目标,进行比对,小的放在序列左边,大的放在左边小序列的右边,因为选取的是用第一个数作为基准值,所以先不移动基准值。排好序后,将tem指向的数:也就是比基准值小的最右边的数,和基准值left交换,这样就完成了基准值左边得数都比他小,右边的数都比他大的操作了。从序列中选择一个数当做基准值,选择放法很多,比如取第一个、最后一个或中间的值。将序列中所有比基准值小的数移动到基准值左边,比基准值大的移动到基准值的右边。接着将基准值两边的序列进行递归排序,最终完成排序。
2024-04-22 22:32:32 212 1
原创 归并、计数排序
在数据不大的情况下,也就是k值较小的情况下,基数排序可以做到O(n)的时间复杂度。将数据转换成键值存储到一个临时数组中,找到最大值和最小值确定临时数组的长度。但是缺点也很明显,在大数据范围或数据离散程度很大的情况性能就会极大下降。归并排序是 一种分治思想的排序。将数组分为两半且递归的应用归并排序。计数排序是O(n+k)的排序方法,k指的是数据的范围。在最坏、平均、最好的情况下都是O(n log n)计数排序不是常规的比较算法,思想上是一种映射,然后临时数组中存储的数据就是该值出现的次数。
2024-04-21 23:21:23 214 1
原创 堆排序原理及实现
2.取出最大(或最小)元素,然后经过调整算法调整堆,每次调整的时间复杂度是。可以这样 分析:1. 首先建堆,时间复杂度为O(n)利用堆本身数据结构的性质来做到大堆升序小堆降序的。堆排序的时间复杂度是稳定的O(n log N)所以堆排序的时间复杂度是O(n log N)之前有提到堆的结构,这里不在赘述。O(log n) 而调整次数是n。
2024-04-20 22:45:46 124
原创 排序——插入排序和希尔排序
插入排序很简单,大致思路就是给一个空数组,每向空数组添加一个数字就向前挨个遍历排序,时间复杂度O(N^2)希尔排序是插入排序的一种改进,核心思想是比较距离较远的数据来交换,使数组逐渐有序,因为分割了数组 ,使数据交换次数变少,效率比插入排序高。但是希尔排序是不稳定的排序,因为相同的数据的相对位置会发生变化。而插入排序不会。
2024-04-17 22:02:30 167
原创 C语言实现堆
我们在插入的时候会用到向上调整,先将要插入的元素存放在数组末尾,然后向上调整,需要注意的是。相应的,向下调整是在删除是用到。所以小堆的堆顶,也就是根节点数据最小,大堆相反,根节点数据最大。,要理解清楚才好下手。
2024-04-12 22:56:42 228
原创 找袜子(异或运算)
然后再以这一位 为0还是为1把数组分成两组分别异或,这样得到的最后数字就是两个只出现一次的数字(出现两次的数字必定被分在同一组)但是本题经过一次遍历之后,ret的结果中是两个不同数字异或的结果。num1 和num2就是数组中不同的两个数。我们知道异或运算会抵消出现两次的数字。如何将他们分离出来呢?
2024-04-05 10:15:03 307 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人