首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路

2.3 深拷贝的解决方案 为了避免浅拷贝带来的问题,我们需要在拷贝构造函数中实现深拷贝。深拷贝确保每个对象都有自己独立的内存空间,不会与其他对象共享内存。...3.2 实现赋值运算符重载 在赋值运算符重载中,我们需要考虑以下几点: 自我赋值:对象是否会被赋值给自己,避免不必要的内存释放和分配。...通过迭代器,可以使用范围 for 循环等简便的方式遍历 string 对象中的字符。...静态变量需要在全局范围内被初始化,以确保在所有对象中共享的唯一实例具有一致的值。 5.1.2.2 const 修饰符的作用 const 表示变量的值在其生命周期内不能被修改。...以上就是关于【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

28820

【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)

pop_back(): 删除末尾的元素。 size(): 返回当前元素的个数。 operator[]: 通过索引访问元素。 std::vector 是一个动态数组,提供了可以动态调整大小的数组实现。...哈希表实现:利用哈希函数实现快速的插入、删除和查找操作。复杂度:平均情况下,查找、插入、删除操作的时间复杂度为O(1)。 常用函数: operator[]: 通过键访问或插入元素。...迭代器:使用范围循环遍历unordered_map中的键值对。 4. 迭代器 定义:迭代器是一种对象,提供对容器元素的遍历功能。几乎所有STL容器都提供迭代器支持。...C++允许使用new和delete进行动态内存管理,以下是一个基本示例: #include int main() { // 动态分配一个int类型的内存空间 int...delete[]: 释放动态分配的数组内存。 7. 面向对象编程(OOP) 定义:面向对象编程是一种编程范式,使用类和对象进行抽象和封装。 类:类是对对象的抽象描述,封装了数据和行为。

7710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    字节一面,轻松通过!

    ArrayList和LinkedList有什么区别 3. 说一下C++的多态 4. 有了解C++的shared_ptr 吗? 5....说一下C++的多态 C++中的多态性是面向对象编程的一个重要概念,它允许不同类的对象对同一消息做出不同的响应。C++实现多态性主要通过虚函数(virtual function)和继承来实现。...派生类必须实现(覆盖)抽象类中的纯虚函数,否则它们也会成为抽象类。 4. 有了解C++的shared_ptr 吗?...std::shared_ptr 是 C++11 引入的智能指针,用于管理动态分配的对象。它允许多个指针共享对同一对象的所有权,提供了一种更安全和方便的内存管理方式,避免了内存泄漏和悬空指针的问题。...std::shared_ptr 是 C++ 中常用的智能指针之一,可以帮助管理动态分配的资源,避免内存泄漏,并提高代码的安全性和可维护性。 5.

    18110

    【c++丨STL】vector的使用

    相比传统的数组,vector附带了一系列操作接口,并且由于内存是动态分配的,所以不必担心插入元素时内存不足的问题。...析构函数(destructor) 析构函数用于释放动态分配的内存空间,在对象声明周期结束时自动调用。 赋值运算符重载operator= 赋值重载用于完成已经存在的对象的拷贝赋值。...如果参数n的值小于当前size,则该函数会将size调整为n值,并且删除超出的元素。 如果参数n的值大于当前size,则会在末尾插入元素至size等于n值。...它的使用方法与下标引用操作符相同。这里需要注意:可移植程序不应该使用超出范围的参数n调用此函数,因为这会导致未定义的行为。...之后博主会带大家深入学习vector的底层原理,并尝试模拟实现。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

    22510

    开心档之C++ 动态内存

    C++ 动态内存 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存。...堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。...如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。...所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作: double* pvalue = NULL; if( !...return 0; } 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

    43720

    七、构造函数与析构函数

    析构函数主要用于释放对象可能占用的资源,如动态分配的内存、文件句柄、数据库连接等。...当obj离开其作用域(在main函数的末尾)时,它的析构函数会被自动调用,输出"MyClass对象被销毁",并释放了动态分配的内存。 注意: 析构函数不能被显式调用(即不能直接调用obj....特点: 如果在类中未显式定义任何构造函数,编译器会自动生成一个无参的默认构造函数。 一旦用户显式定义了构造函数(无论是否有参数),编译器将不再自动生成默认构造函数。...此外,如果其中一个对象删除了它指向的数据,那么另一个对象将成为一个悬挂指针(dangling pointer),指向不再有效的内存区域。...委托构造的使用场景包括: 当类有多个构造函数,并且它们之间有共同的初始化逻辑时,可以使用委托构造来避免代码重复。 当你想要在一个构造函数中扩展另一个构造函数的行为时。

    14010

    C++ 动态内存

    了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: 栈:在函数内部声明的所有变量都将占用栈内存。...堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。...如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。...所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作: double* pvalue = NULL; if( !...return 0; } 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

    70710

    C语言到C++的OOP 面向对象编程

    函数体是由大括号{}括起来的。本例中主函数内只有一个以cout开头的语句。注意C++所有语句最后都应当有一个分号。...return 0; } int max(int x,int y) //定义max函数 {     int z;     if(x>y) z=x;     else z=y;     return(z); } 只要在被调用函数的首部的末尾加一个分号...函数声明的位置应当在函数调用之前。 C++程序的结构特性 一个面向对象的C++程序一般由类的声明和类的使用两大部分组成。 类的使用部分一般由主函数及有关子函数组成。...其主要目的是让C++编译程序进行类型检查,即形参与实参的类型匹配检查,以及返回值是否与原型相符,以维护程序的正确性。...(2)使用new动态分配内存时,如果没有足够的内存满足分配要求, new将返回空指针(NULL)。因此通常要对内存的动态分配是否成功进行检查。

    3.2K2218

    如何进行C++动态转换

    ⭐本文介绍⭐ 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: **栈:**在函数内部声明的所有变量都将占用栈内存。...**堆:**这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。...如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。...所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作: double* pvalue = NULL; if( !...return 0; } 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

    47330

    如何用C++进行动态内存的转换

    ⭐本文介绍⭐ 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分: **栈:**在函数内部声明的所有变量都将占用栈内存。...**堆:**这是程序中未使用的内存,在程序运行时可用于动态分配内存。 很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。...如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。 ​​...所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作: double* pvalue = NULL; if( !...return 0; } 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

    58130

    C++重要知识点小结---3

    智能指针是一个行为类似指针但也提供其他功能的类。 智能指针类实现普通指针行为的类的区别在于:智能指针通常接收指向动态分配对象的指针并负责删除该对象。...用户分配对象,但由智能指针类删除它,因此智能指针类需要实现复制控制成员来管理指向共享对象的指针。只有在撤销了指向共享对象的最后一个智能指针后,才能删除该共享对象。...一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不再指向任何对象。...const int *pci = new const int(1023) ;   5、动态内存的管理容易出错  delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为...“内存泄漏” 读写已删除的对象,如果删除指针所指向的对象后,将指针置为0值,比如容易检测 对同一内存空间使用两次delete表达式。

    92661

    C++ 面试必备:常见 C++ 面试题汇总及详细解析

    当程序发生异常时,可以抛出异常并在可控范围内进行处理,避免程序崩溃。而 C 不支持异常处理机制。 运算符重载 C++ 允许对运算符进行重载,可以使得运算符在处理特定类型的数据时更具有描述性。...讲讲面向对象 面向对象编程有3大特性: 封装:封装是指将对象的属性和方法绑定在一起,形成一个独立的、封闭的单元。...内联函数和普通函数有什么区别? 内联函数和普通函数的区别在于是否进行了“内联优化”。内联函数是一种特殊的函数,编译器会在编译时将其整个函数体插入到调用该函数的地方,从而节省了函数调用的开销。...C++基类的析构函数声明为虚函数是为了确保在通过基类的指针或引用删除派生类对象时,可以正确地释放派生类对象所占用的内存。...delete和free区别 delete和free都可以用于释放动态分配的内存,但是它们之间有以下几点区别: delete是C++中的运算符,而free是C语言中的函数。

    2.2K30

    Java中堆与栈的两种区别

    如果再令a = 4 ;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a 指向这个地址。...堆的优势是可以动态地分配内存大小,生存期也不必实现高速编译器,因为它在运行时动态分配内存的,java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。...当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当做一个垃圾,在不定时的时间内自动回收,因为Java有一个自动回收机制,(而c++没有,需要程序员手动回收,如果不回收就越堆越多,直到撑满内存溢出...自动回收机制(程序)自动监测堆里是否有垃圾,如果有,就会自动的做垃圾回收的动作,但是什么时候收不一定。...(2)插入 将一个新元素插入到表尾,即数组末尾时,如果新构成的二叉树不满足堆的性质,需要重新排列元素,下图演示了插入15时,堆的调整。 ? (3)删除。

    1.2K20

    C++面向对象程序设计_Part1

    看这份笔记需要有c++和c语言的基础,有一些很基础的不会解释。...参数传递分为两种:pass-by-value和pass-by-reference 一条非常考验你是否受过良好c++训练就是看你是不是用pass-by-reference。...动态分配使用的时new命令,返回的是分配出来的内存的首地址,释放动态分配内存使用delete命令,如果分配的是数组对象,则需要在delete后加上[],如果是单个,直接delete指向的指针即可。...上面这个拷贝赋值,首先检查是不是自我赋值,只要有这种情况发生,就要考虑,自我赋值则直接返回this所指的对象就可以了,如果不是自我赋值,则删除分配的内存,重新分配内存,长度为传入字符串的长度+1,同理使用...上面说明的是,如果分配的是动态对象数组,就一定要在delete后面加上[]符号,不然就无法完全释放动态分配的内存。array new一定要搭配array delete。 part1到此结束。

    97420

    内存泄漏漫谈

    对于C/C++来说,内存泄漏问题一直是个很让人头痛的问题,因为对于没有GC的语言,内存泄漏的概率要比有GC的语言大得多,同时,一旦发生问题,也严重的多,而且,内存泄漏的排查往往十分困难。...3、C++类设计不当 典型的,对于C++在子类中的动态分配的指针,析构函数执行释放操作,如果基类析构函数不是virtual,泄漏也会发生: class BaseClass { public: BaseClass...还有如果缺少或错误的拷贝构造函数(包括赋值运算符重载)造成的对象浅拷贝问题,封装时函数返回动态分配的对象留下内存泄漏隐患等等。...首先,在编码时,一定要有“有借有还”的意识,保持良好的编码习惯,对于动态分配的内存,一定要注意释放操作;对于复杂的逻辑,或者有异常处理的场景,尽量不要使用裸露的指针,这里不得不提到RAII(Resource...,只要在分配内存和释放内存时分别做好记录,程序结束时对比分配内存和释放内存的记录就可以确定是不是有内存泄漏。

    2.6K70

    vector

    与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。...这是 C++ 模板机制的灵活性体现,vector 可以通过指定模板类型来存储任意数据类型。...std::sort 是 C++ 标准库中用于对范围内元素进行原地排序的高效排序函数。默认情况下,std::sort 使用升序排列。...这个扩容机制为了提高插入效率,通常不会每次只扩展一个元素的容量,而是采用倍增方式,常见的扩容因子有 1.5 倍或者 2 倍(VS中是1.5倍扩容,Linux中是2倍扩容)。...capacity() 返回vector当前分配的容量大小。 empty() 检查vector是否为空(即是否包含任何元素)。 resize(n) 调整vector的大小为n,必要时添加或移除元素。

    10610

    【C++】动态内存管理

    sizeof() 计算字符串的长度,包含末尾的 '\0',strlen() 计算字符串的长度,不包含字符串末尾的 '\0'。...更多详细有关C语言动态内存管理的知识可以移步:【C语言】内存的动态分配与释放 在C++中,动态内存的管理是通过一对运算符来完成的: new,在动态内存中为对象分配空间并返回一个指向该对象的指针...使用new动态分配和初始化对象 在堆空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回一个指向该对象的指针: int* pi = new int;//pi指向一个动态分配的...当我们想要构造多个对象时,我们只需要在类型后面加上:[个数],就可以了,如: int* pia = new int[10]; 默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值将是未定义的...,如果我们想要在动态分配时就直接将空间初始化,则需要使用传统的构造方式(使用圆括号),如: int* p = new int(5); //p指向的对象的值为5 当我们想要一次性初始化数组的多个对象时

    12510

    开发成长之路(6)-- C++从入门到开发(C++入门不难)

    C/C++。 C++,在C语言的基础上增添了新的特性,主要为类。 其实类也是源自于对C语言结构体的发扬光大。正因为有了类的出现,C++带有着强的封装性、继承性、多态性。...为什么说C++有很强的封装性呢,就是因为这三个类访问修饰符。...---- 析构函数呢,相对比较简单,但是也是有坑在里面的。 类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。 一般用于程序员手动回收内存。...---- C++ 动态内存 了解一下堆栈: 栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。...= new char[20]; // 为变量请求内存 delete [] pvalue; // 删除 pvalue 所指向的数组 ---- 对象的动态内存分配 int main( )

    76620
    领券