首页
学习
活动
专区
圈层
工具
发布

模拟实现C++中的string类(详细解析)

学习C++,特别是C++中的STL部分,重点不是学习如何去使用STL,而是知道其底层原理是怎么样的,是怎么去实现的。因此,本篇文章带来的是对C++中的string的模拟实现。..._str); } 解析:拷贝构造跟构造函数的实现方法差不多,区别就在于拷贝构造是将参数s的属性内容全部拷贝到this中,所谓this,就是调用拷贝构造的string类对象的指针。...当然啦,我们发现我们这里实现的时候,用到了reserve和operator[],这两个我们还没实现,但这样说明了C++在设计的时候,很多功能都是互相辅助的,没你没我都不行。...四.模拟实现string类对象修改操作 ①push_back() push_back的实现,相当于数据结构中的顺序表差不多,如果我们对顺序表的实现熟悉的话,实现push_back一点问题都没有。...还有就是,在C++的string类的库中,end的类型就是size_t的,我们既然要模拟实现string,我们就遵循规则。那么我们该如何取解决这个问题呢? 好办!

1.4K20

【C++】深度解析:用 C++ 模拟实现 string 类,探索其底层实现细节

✨g++下string的结构 g++ 下, string 是通过写时拷贝实现的, string对象总共占4个字节 ,内部只包含了一个指针,该指 针将来指向一块堆空间,内部包含了如下字段: 空间总大小...浅拷贝 浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来 。...如果用std::swap交换两个string对象,将会发生1次构造和2次赋值,也就是三次深拷贝; 而string内部的swap仅仅只交换成员,代价较小。...对于流提取,如果频繁的尾插,会造成频繁扩容。而且C++的扩容和C语言的扩容不一样,C++使用new不能原地扩容,只能异地扩容,异地扩容就会导致新空间的开辟、数据的拷贝、旧空间释放。...另外由于C++的标准输入流默认把空格和换行当作分隔符,不读取,所以这里要用in.get()来接收字符。 ✨getline 基本上可以直接复用流提取的代码。

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

    【C++】深度解析:用 C++ 模拟实现 list 类,探索其底层实现细节

    list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。...⭐list模拟实现 list的底层是双向链表结构,包含有一个哨兵节点。...模拟实现list,要实现下列三个类: ①list节点类 ②迭代器的类 ③list主要功能的类(size(),empty()...)...模拟实现list的类的基本功能(增删等操作)要建立在迭代器类和节点类均已实现好的情况下才得以完成。...将原生态指针进行封装,因迭代器使用形式与指针完全相同,因此在自定义的类中必须实现以下方法: 指针可以解引用,迭代器的类中必须重载operator*() 指针可以通过->访问其所指空间成员,迭代器类中必须重载

    40610

    【C++篇】STL中list的奥秘与实现解析

    list即为数据结构中的链表,我们在学习初阶数据结构的时候已经学习过他的结构了并用C语言实现了他,。我们知道,链表分为是否带头、是否双向和是否循环,因此有8种链表。...而功能最强大的就是带头双向循环链表,因此STL选用了他作为list。STL也有单链表,它是forword_list,但用的很少。...【初探数据结构】线性表————链表(一)(单链表的实现) 【初探数据结构】线性表——链表(二)带头双向循环链表(详解与实现) 本文目标: 了解list的用法,什么时候用?该怎么用?...) 用[first, last)区间中的元素构造list 使用演示: //构造空的list list lt1; //构造的list中包含n个值为val的元素 list lt2(5...二、list模拟实现(牢记) 我们大致观摩一下stl中的list源码,发现它是分为3个类来实现的: 结点类 迭代器类 list类 它将结点和迭代器都另外封装了起来,而list的成员变量只有一个头结点_head

    49210

    C++多线程中的join, detach, joinable

    thread是C++11中提供多线程编程的模块,使用的时候需要包含头文件。        ...首先我们先来看一下简单的hello world的多线程的代码(win10下vs2019) ?        ...当然我们可以用this_thread::get_id()这个函数来验证这个子线程和主线程是不同的两个线程,结果如下图所示 ?        可见两个线程的id是不同的。        ...然后我们再看一下下面的这个图,用的是detach函数: ?        ...从这个图中我们可以发现fun和main是交叉着输出的,并不是先输出fun中的内容,那么detach的作用就是将主线程与子线程分离,主线程将不再等待子线程的运行,也就是说两个线程同时运行,当主线程结束的时候

    7.7K62

    MapReduce初体验——统计指定文本文件中每一个单词出现的总次数

    本篇博客,小菌为大家带来的则是MapReduce的实战——统计指定文本文件中每一个单词出现的总次数。 我们先来确定初始的数据源,即wordcount.txt文件! ?...import java.io.IOException; /** * @Auther: 封茗囧菌 * @Date: 2019/11/11 17:43 * @Description: * 需求:在一堆给定的文本文件中统计输出每一个单词出现的总次数...是java中的数据类型,hadoop中并不识别.hadoop中有对应的数据类型 public class WordCountMapper extends Mapper<LongWritable, Text...*/ //1.将Text类型的value 转换成 string String datas = value.toString(); //2.将这一行用...思路回顾: 每读取一行数据,MapReduce就会调用一次map方法,在map方法中我们把每行数据用空格" "分隔成一个数组,遍历数组,把数组中的每一个元素作为key,1作为value

    2.3K10

    【C++指南】C++中nullptr的深入解析

    引言 在C++编程中,处理指针是常见的任务之一。然而,空指针(即不指向任何有效内存地址的指针)的处理尤为重要,因为它直接关系到程序的健壮性和安全性。...一、nullptr的引入背景 在C++11之前,空指针通常通过NULL宏来表示,这个宏在C和C++中被广泛定义为0或(void*)0。...4.与智能指针的交互 nullptr可以与C++的智能指针(如std::unique_ptr、std::shared_ptr等)一起使用,用于初始化或表示智能指针不拥有任何资源的情况。...std::unique_ptr uptr = nullptr; std::shared_ptr sptr = nullptr; 4.模板代码中的使用 在模板代码中,nullptr...通过使用nullptr,可以显著提高代码的可读性、安全性和可维护性。在C++11及更高版本中,强烈推荐使用nullptr来替代旧式的NULL宏。

    1.1K10

    【C++经典例题】反转字符串中单词的字符顺序:两种实现方法详解

    问题描述 在处理字符串相关的问题时,反转字符串中每个单词的字符顺序是一个常见的任务,同时要保证空格和单词的初始顺序不变。...给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 s 包含可打印的 ASCII 字符。 s 不包含任何开头或结尾空格。 s 里 至少 有一个词。...s 中的所有单词都用一个空格隔开。 原题链接:557. 反转字符串中的单词 III - 力扣(LeetCode) 下面我们将详细介绍两种解决该问题的方法,包括其解题思路和具体实现细节。...代码实现 class Solution { public: string reverseWords(string s) //快慢指针解法 { string::iterator...代码可读性:基于索引的方法代码相对更加简洁,使用索引来处理字符串更加直观,而基于快慢指针的方法需要对指针的操作有较好的理解 通过以上两种方法的详细介绍,我们可以根据具体的需求和个人习惯选择合适的方法来解决反转字符串中单词字符顺序的问题

    56111

    Java用Jsoup库实现的多线程爬虫代码

    因为没有提供具体的Python多线程跑数据的内容,所以我们将假设你想要爬取的网站是一个简单的URL。以下是一个基本的Java爬虫程序,使用了Jsoup库来解析HTML和爬虫ip信息。...connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 创建一个Document对象来解析...:1、创建一个URL对象,表示要爬取的网站的URL。...这个方法接受两个参数:要设置的请求头的名称和值。4、打开连接并获取响应码。我们通过get()方法来获取响应码。如果响应码是200,表示请求成功。5、创建一个Document对象来解析HTML。...我们通过for-each循环来遍历所有的链接,然后打印每个链接的绝对URL。8、如果连接失败,打印错误信息。注意:在实际使用中,你需要根据具体的网站和爬取的内容来修改代码。

    75730

    深度解析C++中的map的使用

    map底层是用红黑树实现,增删查改效率是O(logN),迭代器遍历是走的中序,所以是按key有序顺序遍历的。...,不能对first进行修改的find函数的返回值find 函数是 C++ 标准库中的 std::map 和 std::unordered_map 容器提供的一个方法,用来在容器中查找指定的键。...mapcountMap; //遍历输入单词列表 words,每遇到一个单词,就增加它在 countMap 中对应的计数值。...(),v.end(),Compare());//然后进行排序的操作 //创建一个结果向量 retv,从排序后的 vector 中取出前 k 个单词(即频率最高的单词 vector...(),Compare());//然后进行排序的操作 //创建一个结果向量 retv,从排序后的 vector 中取出前 k 个单词(即频率最高的单词 vector<string

    99900

    深度解析C++中的set的使用

    顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。...2.set的介绍访问地址set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数...set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。...//算法库的find,时间复杂度O(N)auto pos1 = find(s.begin(), s.end(), x);//set自身实现的查找O(logN)auto pos2 = s.find(x);...cur进行遍历链表然后再使用set中的count进行节点是否存在进行判断,如果存在的话就返回1,那么我们就字节返回这个节点,因为set中已经存在了一个相同的节点,如果再出现一次的话,那么我们直接就将这个节点返回了

    1.3K10

    从 Java 到 C++:用 JNI 实现字符串拼接全解析

    JNI.java选项生成 C/C++ 标头并将其放置在指定的目录中(在上面的示例中, '.'表示当前目录)。...通过 extern "C",可以关闭 C++ 的名称修饰功能,确保生成的函数名与 Java 头文件中的声明匹配。...第三步:实现C++代码创建一个名为StringConcatenator.cpp的文件,并将生成的.h文件,拷贝到月cpp文本同一层级目录下,然后实现拼接逻辑:在 C++ 中通过 JNI API 实现头文件中声明的函数逻辑...第五步:运行Java程序调用 Java 中的 native 方法,验证 C++ 的实现功能。现在我将编译好的dll文件,放置到项目的dll文件夹中,然后同通过main方法运行程序。...经验总结代码实现总结Java层定义本地方法:通过native修饰符定义方法并加载动态链接库。C++实现核心逻辑:通过JNI接口与Java交互,实现高效的字符串操作。

    1.4K30

    颠倒字符串中的单词 算法解析

    颠倒字符串中的单词 - 力扣(LeetCode) 2、题目描述 给你一个字符串 s ,颠倒字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。...s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。...返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。...二、解题 1、思路分析 这道题有两个步骤,一是拆分字符串中的单词,二是翻转字符串中的单词。 因为很多编程语言都自带的有对字符串的操作,比如说拆分、翻转、连接等方法。...2、代码实现 代码参考: class Solution { public String reverseWords(String s) { // 除去开头和末尾的空白字符

    1.1K10

    Java多线程之---用 CountDownLatch 说明 AQS 的实现原理

    CountDownLatch 的使用 前面的文章中说到了 volatile 以及用 volatile 来实现自旋锁,例如 java.util.concurrent.atomic 包下的工具类。...将当前线程加入等待队列,并通过 parkAndCheckInterrupt()方法实现当前线程的阻塞。下面一大部分都是在说明 CHL 队列的实现,里面用 CAS 实现队列出入不会发生阻塞。...Java 实现的 CAS 是调用 unsafe 类提供的方法,底层是调用 c++ 方法,直接操作内存,在 cpu 层面加锁,直接对内存进行操作。...1、if 分支,如果尾节点为 null,说明现在队列中还没有等待线程,则尝试 CAS 操作将头节点初始化,然后将尾节点也设置为头节点,因为初始化的时候头尾是同一个,这和 AQS 的设计实现有关, AQS...是调用 AQS 的 releaseShared 方法来实现的,下面代码中的方法是按顺序调用的,摘到了一起,方便查看: // AQS类 public final boolean releaseShared

    1.2K00

    Redis 6 中的多线程是如何实现的!?

    那就是和其它的主流程序一样引入多线程,用更多的线程来分担这些可能耗时的操作。事实上 Redis 也确实这么干了,在 6.0 以后的版本里,开始支持了多线程。...我们今天就来领略一下 Redis 的多线程是如何实现的。...先处理读任务队列,解析其中的请求,并处理之。然后将处理结果写到缓存中,同时写到写任务队列中。...接着在 processInputBuffer 中将输入缓冲区中的数据解析成对应的命令。解析完命令后真正开始处理它。...坦白讲,我觉得这种多线程模型实现的并不足够的好。 原因是主线程是在处理读、写任务队列的时候还要等待其它的 io 线程处理完才能进入下一步。

    2.5K41
    领券