C++效率掌握之STL库:string底层剖析

MobaXterm详细使用教程 当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,… 阅读详情
AI摘要

本文深入剖析了C++ STL库中string类的底层实现,包括其基本函数、遍历、扩容追加、插入删除、查找提取、大小调整以及流输出流提取等操作的细节和注意事项。通过理解string的内存管理和操作原理,可以帮助开发者在实际编程中避免性能问题和内存错误。

了解完 string 函数的主要用法,很有必要对 string 进行深层次的剖析,进一步了解其运作原理,深化理解的同时帮助我们在找 Bug 时提升效率

在学习本专题前,请详细学习有关 string 的使用

传送门:C++效率掌握之STL库:string函数全解

1.学习string底层的必要性

在 C++ 中,知道 string 是如何以字符数组的形式存储,以及字符串连接、查找等操作的时间复杂度,就可以避免在循环中频繁进行字符串连接操作,因为这可能会导致多次内存重新分配和数据复制,从而影响性能,而是选择更高效的方式,如预先分配足够的空间。同时,理解 string 底层对内存的管理方式,有助于优化内存使用,避免空指针和越界的情况出现

2.string类对象基本函数实现

实现一个类首先先从其基本函数开始,包括构造函数、析构函数、内存管理等

namespace bit
{
	class string
	{
	public:
		string()//空构造
			:_size(0)
			, _capacity(0)
			, _str(new char[1])
		{
			_str[0] = '\0';
		}

		string(const char* str)//字符串构造
			:_size(strlen(str))
			,_capacity(_size)
			,_str(new char[_capacity + 1])
		{
			strcpy(_str, str);
		}
		
		string(const string& s)//拷贝构造
		{
			_str = new char[s._capacity + 1];
			strcpy(_str, s._str);
			_size = s._size;
			_capacity = s._capacity;
		}
		
		// 赋值运算符重载
        string& operator=(const string& s) {
            if (this != &s) {  // 避免自我赋值
                delete[] _str;  // 释放原有内存
                _size = s._size;
                _capacity = s._capacity;
                _str = new char[_capacity + 1];  // 分配新内存
                strcpy(_str, s._str);  // 复制内容
            }
            return *this;
        }

		~string()
		{
			delete[] _str;
			_str = nullptr;
			_size = _capacity = 0;
		}

		const char* c_str() const
		{
			return _str;
		}

	private:
		size_t _size;
		size_t _capacity;
		char* _str;
	};
}

简单实现一个空构造和字符串构造,因为还没写 string 流输出的运算符重载,先将 string 类转成 C 语言风格来输出

🔥值得注意的是: 注意变量声明的顺序要和初始化列表一致,也要注意变量初始化顺序对另一个变量的影响;=运算符重载:自我赋值是指对象在赋值时被赋值给自己,例如 s1 = s1,在这种情况下,如果我们没有进行检查,就会先删除对象的内存,然后再试图复制同一个对象的内容,这样会导致程序崩溃。因此,重载赋值运算符时,自我赋值检查是非常必要的

3.string类对象的遍历

size_t size() const//加const保证const和普通string都能调用
{                  //增加普遍性,涉及权限的缩小
	return _size;
}

char& operator[](size_t pos)//可读写
{
	assert(pos < _size);
	return _str[pos];
}

char& operator[](size_t pos) const//只读
{
	assert(pos < _size);
	return _str[pos];
}

typedef char* iterator;
iterator begin()
{
	return _str;
}

iterator end()
{
	return _str + _size;
}

typedef const char* const_iterator;
iterator begin() const
{
	return _str;
}

iterator end() const
{
	return _str + _size;
}

想要遍历一个字符串,首先就要知道大小,然后需要用方括号来获取索引,或者用迭代器遍历,迭代器的本质其实就是一个字符数组

🔥值得注意的是:

  1. 注意 size 函数和 c_str 函数要具有普遍性,所以要包括 const 变量的情况,,即使是普通类型调用也是权限的缩小,两种情况共用一个函数
  2. operator[] 分为加 const 和不加 const ,分别代表只读和可读写
  3. 同样迭代器也分为 iterator 和 const_iterator
  4. begin() 指向第一个有效字符,end() 指向最后一个有效字符的后一位

4.string类对象的扩容追加

void reserve(size_t n)
{
	// 检查请求的内存大小 n 是否大于当前的容量 _capacity
	if (n > _capacity)
	{
		// 若 n 大于 _capacity,则分配 n + 1 个字符的内存空间
		// 多分配一个字符是为了存储字符串的结束符 '\0'
		char* tmp = new char[n + 1];

		// 将原字符串 _str 复制到新分配的内存区域 tmp 中
		strcpy(tmp, _str);

		// 释放原字符串 _str 所占用的内存空间
		delete[] _str;

		// 将 _str 指针指向新分配的内存区域 tmp
		_str = tmp;

		// 更新当前字符串的容量为 n
		_capacity = n;
	}
}

void push_back(char ch)
{
	// 检查当前字符串的实际字符数量 _size 是否等于其容量 _capacity
	if (_size == _capacity)
	{
		// 如果容量为 0,将容量扩展为 4;否则将容量扩大为原来的 2 倍
		reserve(_capacity == 0 ? 4 : _capacity * 2);
	}

	// 在字符串的末尾(即 _size 位置)添加新字符 ch
	_str[_size] = ch;

	// 实际字符数量加 1
	++_size;

	// 在新的字符串末尾添加字符串结束符 '\0'
	_str[_size] = '\0';
}

void append(const char* str)
{
	// 计算要追加的字符串的长度
	size_t len = strlen(str);

	// 检查当前字符串的实际长度 _size 加上要追加的字符串长度 len 是否超过当前容量 _capacity
	if (_size + len > _capacity)
	{
		// 如果超过容量,调用 reserve 函数进行扩容,扩容后的容量至少为 _size + len
		reserve(_size + len);
	}

	// 将追加的字符串 str 复制到当前字符串 _str 的末尾位置(_str + _size)
	strcpy(_str + _size, str);

	// 更新当前字符串的实际长度,加上要追加的字符串的长度
	_size += len;
}

string& operator+=(const char* str)
{
	append(str);
	return *this;
}

或许扩容添加的函数看起来操作简单,但其实其底层有许多细节

🔥值得注意的是:

  1. reserve 传入的参数 n 指的是有效字符,new 一个新空间时 +1 是为了给 '\0' 留位置,capacity 也表示的是有效字符的容量,同时要记得释放原来指向的不使用的空间
  2. push_back 函数 reserve 时要判断下是因为扩容是 *2 ,避免空间为 0 时扩容 *2 导致出错
  3. push_back 通常只是添加一个字符,不会涉及修改,所以不用传 const 参数;append 的参数可能会被错误修改,所以要传 const 参数,普通的参数可以通过权限缩小正常使用函数

5.string类对象的插入、删除

void insert(size_t pos, size_t n, char ch)
{
	assert(pos <= _size);

	if (_size + n > _capacity)
	{
		reserve(_size + n);
	}

	size_t end = _size;
	while (end >= pos && end != npos)
	{
		_str[end + n] = _str[end];
		--end;
	}

	for (size_t i = 0; i < n; i++)
	{
		_str[pos + i] = ch;
	}
	_size += n;
}

void insert(size_t pos, const char* str)
{
	assert(pos <= _size);

	size_t len = strlen(str);
	if (_size + len > _capacity)
	{
		reserve(_size + len);
	}

	size_t end = _size;
	while (end >= pos && end != npos)
	{
		_str[end + len] = _str[end];
		--end;
	}

	for (size_t i = 0; i < len; i++)
	{
		_str[pos + i] = len;
	}
	_size += len;
}

void erase(size_t pos, size_t len = npos)
{
	assert(pos <= _size);

	if (len == npos || pos + len >= _size)
	{
		_str[pos] = '\0';
		_size = pos;
		_str[_size] = '\0';
	}
	else
	{
		size_t end = pos + len;
		while (end <= _size)
		{
			_str[pos++] = _str[end++];
		}
		_size -= len;
	}
}

string 类的插入删除都利用的是移动覆盖的思想,这里就不画图了,在数据结构阶段就已经学习了大致的思路

🔥值得注意的是:

  1. 这里使用 size_t 类型的 end 作为索引来遍历字符串,size_t 是无符号整数类型。当 end 递减到 0 后再进行 --end 操作时,会发生无符号整数溢出,end 的值会变成 size_t 类型所能表示的最大值,这个值恰好和 npos(被初始化为 -1 转换后的 size_t 最大值)相等
    如果没有 end != npos 这个条件,当 end 溢出后,end >= pos 仍然可能为真(因为溢出后的值很大),这就会导致循环继续执行,从而造成数组越界访问,引发未定义行为。加上 end != npos 这个条件,当 end 溢出变成 npos 时,循环就会终止,避免了越界访问的问题
  2. 注意 capacity 在 reserve 里已经修改过了,所以外面只需要再修改 size 就行了

6.string类对象的查找、提取、大小调整

size_t find(char ch, size_t pos = 0)
{
	assert(pos < _size);

	for (size_t i = pos; i < _size; i++)
	{
		if (_str[i] == ch)
		{
			return i;
		}
	}
	return npos;
}

size_t find(const char* str, size_t pos = 0)
{
	assert(pos < _size);

	const char* ptr = strstr(_str + pos, str);
	if (ptr)
	{
		return ptr - _str;
	}
	else
	{
		return npos;
	}

}

string substr(size_t pos = 0, size_t len = npos)
{
	assert(pos < _size);

	size_t n = len;
	if (len == npos || len + pos > _size)
	{
		n = _size - pos;
	}
	string tmp;
	tmp.reserve(n);
	for (size_t i = pos; i < n; ++i)
	{
		tmp.push_back(_str[i]);
	}
	return tmp;
}

void resize(size_t n, char ch = '\0')
{
	if (n < _size)
	{
		_size = n;
		_str[_size] = '\0';
	}
	else
	{
		reserve(n);
		for (size_t i = _size; i < n; ++i)
		{
			_str[i] = ch;
		}
		_size = n;
		_str[_size] = '\0';
	}
}

string 的查找操作比较简单,提取要注意提取的长度与原字符串长度的关系,调整大小也要注意 '\0' 的位置

🔥值得注意的是:

return ptr - _str:通过指针相减计算子字符串在原字符串中的起始位置索引。因为 ptr 指向子字符串的起始位置,_str 指向原字符串的起始位置,两者相减得到的差值就是子字符串的起始位置索引

7.string类对象的流输出、流提取

void clear()
{
	_str[0] = '\0';
	_size = 0;
}

ostream& operator<<(ostream& out, const string& s)
{
	for (size_t i = 0; i < s.size(); i++)
	{
		out << s[i];
	}
	return out;
}

istream& operator>>(istream& in, string& s)
{
	// 清空字符串 s 原有的内容
	s.clear();
	// 从输入流 in 中读取一个字符并赋值给 ch
	char ch = in.get();
	//处理前缓冲区前面的空格和换行
	while (ch == ' ' || ch == '\n')
	{
		ch = in.get();
	}
	// 定义一个大小为 128 的字符数组 buff 用于临时存储字符,初始化为全 '\0'
	char buff[128] = { '\0' };
	// 定义一个索引变量 i 用于记录 buff 数组当前存储字符的位置,初始化为 0
	int i = 0;

	// 循环处理连续的空格和换行符
	while (ch == ' ' || ch == '\n')
	{
		// 将当前读取到的空格或换行符存入 buff 数组,并将索引 i 加 1
		buff[i++] = ch;
		// 检查 buff 数组是否快满(只剩下一个位置用于存储字符串结束符 '\0')
		if (i == 127)
		{
			// 在 buff 数组末尾添加字符串结束符 '\0'
			buff[i] = '\0';
			// 将 buff 数组中的内容添加到字符串 s 中
			s += buff;
			// 重置索引 i 为 0,以便重新使用 buff 数组
			i = 0;
		}
		// 从输入流 in 中读取下一个字符并赋值给 ch
		ch = in.get();
	}

	// 如果 buff 数组中还有剩余字符(即 i 不为 0)
	if (i != 0)
	{
		// 在 buff 数组末尾添加字符串结束符 '\0'
		buff[i] = '\0';
		// 将 buff 数组中的剩余内容添加到字符串 s 中
		s += buff;
	}
	// 返回输入流 in,以便支持链式输入操作
	return in;
}

🔥值得注意的是:

  1. 当放在自定义的命名空间以外时,需要在参数 string 前加作用域限定,不然默认访问了库里自带的 string
  2. 由于不断的 += 来输入字符要不断的更新空间,效率不高,所以采用开辟数组的方式

希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!


请添加图片描述

腾讯云智后台开发实习面试全纪录(已offer) 腾讯云智后台开发实习面经 阅读详情

相关推荐

保姆级CVE-2018-17066漏洞复现 DLink命令注入漏洞(更新完结)

之后按照之前复现的方式一样 我们丢到kali中执行binwalk解析。之后为了模拟 可以在kali里安装qemu-mipsel。在bin目录下可以尝试将goahead的环境搭配好。固件官网可以进行下载。

weixin_51339377的博客 882

【剖析STL】String

String中各个函数和细节的讲解

一个喜欢猫咪的程序员 869

PSF(点扩散函数)与去卷积算法消除图像模糊

本文旨在总结图像处理中使用去卷积的传统方法来进行图像去模糊的相关知识。

m0_53607446的博客 6014

c++:STL:string

我们看到这里的c和f是不同的类型,所以我们在同一行声明他们的时候auto会识别第一个变量c的类型,也就是整形(相当于 int a = c, b = f),然而f是double类型的,所以会报错。

2301_79954395的博客 1437

别再翻手册了!用Materials Studio的Forcite模块,5步搞定复杂溶剂的溶解度参数计算

本文详细介绍了如何使用Materials Studio的Forcite模块,通过5个步骤快速计算复杂溶剂的溶解度参数。从分子建模、结构优化到分子动力学采样,再到最终的内聚能密度计算,该方法大幅提升了石油化工和高分子材料研发中的效率,避免了传统手册查阅和实验的繁琐过程。

weixin_28707739的博客 280

2024最新版:MacOS Sonoma系统下CocoaPods安装全攻略(解决Ruby版本冲突)

本文详细介绍了在MacOS Sonoma系统下安装CocoaPods的全过程,重点解决Ruby版本冲突问题。通过HomeBrew安装最新Ruby版本,配置环境变量,并正确安装CocoaPods,帮助iOS开发者顺利管理项目依赖。文章还提供了常见问题的解决方案和优化配置建议,确保开发环境的稳定性和高效性。

lll78的博客 1042

C++STL:深度剖析string,手撕string代码

言C++之言,聊C++之识,以C++会友,共向远方。各位博友,你们好啊,这里是持续分享C++知识的小赵同学,今天要分享的C++知识是,在这一章,小赵将会向大家深度剖析string的代码实现,并尝试去实现string。

zcg3063126760的博客 1180

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

【C++】STL简介 -- string 的使用及其模拟实现

STL简介、string 的基本使用、string 的模拟实现

在平淡的日子里寻找存在的价值 1595

HMC5883L磁力计在STM32F4上的I2C驱动与数据校准实战

本文详细介绍了HMC5883L磁力计在STM32F4平台上的I2C驱动开发与数据校准实战。通过解析寄存器配置、数据读取处理和椭圆拟合校准算法,帮助开发者实现精准的地磁测量,特别适用于无人机导航和机器人系统中的航向确定与陀螺仪漂移修正。

2y3u4i5o6p的博客 1037

使用C++实现DNS欺骗攻击

其中,domain_name表示需要欺骗的域名,dns_server_ip表示实际DNS服务器的IP地址,fake_ip表示需要重定向到的IP地址。在DNS查询过程中,当客户端向DNS服务器请求解析某个域名时,DNS服务器会返回该域名对应的IP地址。DNS劫持是一种常见的网络攻击方式,通过篡改DNS响应数据,使得用户访问的网站被重定向到攻击者指定的恶意站点。我们使用C++编写一个简单的DNS欺骗程序,使得当客户端请求解析特定的域名时,我们可以将其重定向到指定的IP地址。使用C++实现DNS欺骗攻击。

TechGlide的博客 411

C++ STL底层剖析

STL源码剖析:六大组件与底层实现 摘要:本文深入剖析SGI STL 3.3版本的实现机制,重点解析其六大核心组件。空间配置器采用两级内存管理策略,通过16个空闲链表精准控制128字节内的小块内存分配,配合内存池减少碎片;迭代器作为算法与容器的桥梁,通过traits机制实现类型萃取,分为五类不同能力的迭代器;容器提供多样化数据结构,算法通过迭代器统一操作接口,仿函数作为策略定制点,适配器转换组件接口。文章详细探讨了内存管理优化、迭代器失效问题等关键技术,揭示了STL高效运作的底层原理,展现了泛型编程的精妙设

Tlate的博客 687

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++STL】告别 C 字符串噩梦!C++ string 类从入门到精通,含实战避坑指南

本文从 STL 框架出发,先说明 C 字符串存在数据与操作分离、内存需手动管理、易越界等问题,凸显 C++ string 类的优势。接着介绍 C++11 的 auto(简化类型声明)和范围 for(便捷遍历)语法。再梳理 string 核心接口,包括构造、容量(如大小、预留空间)、访问(如数组式访问)、修改(如拼接、查找)等功能用法。深入解析 VS 的 “小字符串优化” 与 G++ 的 “写时拷贝” 两种底层实现差异,重点讲浅拷贝的致命问题及传统、现代两种深拷贝实现方法,文末附 string 模拟实现资源

2402_87731470的博客 3555

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手搓简单 string 库:了解C++ 字符串底层

这一篇实现了简单的string的库,从原理到代码讲解,帮助大家理解string的底层逻辑,为后续学习STL打下坚实基础

liriying的博客 982

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STL——string剖析

引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给 计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该 对象时资源的最后一个使用者,将该资源释放;这里参数就不展开讲了,了解了前面的函数,其实会对字符串参数有个大概的了解,如果要指定位置,通常用下标和迭代器,指定字符串长度有len,指定字符有c,指定字符的个数有n,指定C风格字符串有s,指定string类型有str,这里的i1、i2和前面的first和last差不多。

辰多代码的博客 914

STL详解---string类的使用

网上有句话说:不懂STL不要说你会C++。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己造轮子,站在前人的肩膀上,健步如飞地飞速开发。

分享学习的知识,记录我的技术成长道路 2711

【C++】深度剖析string类的底层结构及其模拟实现

深度剖析string类的底层结构及其模拟实现

m0_70980326的博客 2646

【浅尝C++】STL第一弹=>STL简介/string常用接口使用示例/string模拟实现代码详解

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。也就是说,我们可以通过调用STL提供的各种类、函数接口来使用常见的数据结构与算法,大大提高了代码的编写效率。

Jammingpro 875

深入计算机语言之C++:STL之string的认识与使用

STL——StandardTemplateLibary STL标准模板库,是 C++ 标准库的重要组成部分,它不仅是一个可重复的组件库,还是个包罗数据结构与算法的软件框架。

x3262551980的博客 1636

C++ 开发者必看!STL 库 + 字符编码一篇通,告别乱码与重复造轮子

如果你是正在学习 C++ 的开发者,大概率听过两个 “绕不开” 的话题:一是 STL 库 —— 江湖传言 “不懂 STL,不算会 C++”,它能帮你跳过重复造轮子的坑,直接调用成熟的数据结构与算法;二是字符编码 —— 写代码时突然遇到的 “乱码”,多半是 ASCII、Unicode、GBK、UTF-8 没搞明白。这篇博客就从基础出发,一边带你吃透 STL 库的核心(版本、六大组件、学习路径),一边理清字符集之间的演化关系,帮你打通 C++ 开发的 “基础关卡”,不管是笔试面试还是实际项目,都能少走弯路。

会当凌绝顶,一览众山小 1957

【C++】STL--string类--拆析解剖string类的实现以及string类的底层详解(1)

前面我们简介了一下STL,接下来开始真正的学习,刚开始你可以理解为这就死C++的数据结构。

2501_93351213的博客 839

【CPP】CPP的STL(前篇)

简单来说:CPP在有了模板之后,很多重复性质的代码就不需要自己手撕很多遍了,甚至说有前人做了一个库,把常见的算法,数据结构啥的放进库里面,这些数据结构,算法啥的全都采用了模板类和模板函数的形式,使得这个库里的代码复用率极高,况且写这个库的人都是大佬级别的大佬,效率也很不错,所以在CPP实际开发中,就不需要自己再造轮子了,调用这个库里的玩意就行STL目前有两个需要去学习的版本,一个是微软家的PJ版,一个是GCC(Linux)的SGI版,这俩调用的效果都是一样的,只是底层不一样,需要了解一下。

2302_79981653的博客 1441

STL库string的使用和模拟实现

本文介绍了C++ STL中string容器的使用方法和模拟实现。主要内容包括:1. string常用接口的使用,涵盖构造初始化、赋值拼接、遍历访问、修改删除、查找比较等操作;2. string的模拟实现,讲解简易版string类的设计思路和关键代码。文章通过丰富的代码示例演示了各种接口的用法,并指出使用时的注意事项,如越界检查、迭代器失效等。最后还介绍了string在实际开发中的典型应用场景,帮助读者全面掌握这一基础容器。

2402_87867439的博客 1053

C++STL简介与初识String类

(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的,而且是一个包罗的软件框架。

2301_79351530的博客 787

C++ STL string深度解析:从容器本质到SSO优化与性能实践

在C++标准模板库中,容器是管理数据集合的核心组件,其设计遵循泛型编程思想,旨在提供高效、安全且易用的数据操作接口。string作为最常用的序列容器之一,其底层实现基于basic_string模板,不仅封装了字符序列的存储与管理,更通过短字符串优化等机制显著提升了性能。从技术价值看,理解string的容器本质有助于掌握STL的统一设计模式,而SSO优化则解决了大量短字符串场景下的堆分配开销问题,结合reserve预分配策略,能有效避免内存重分配带来的性能损耗。这些特性使得string在文本处理、数据序列化、

314

从string入门STL:C++标准库核心组件与泛型编程实战

在C++编程中,标准模板库(STL)是构建高效、可靠软件的核心基础设施。它通过泛型编程思想,提供了一套通用的容器、算法和迭代器组件,实现了数据结构和算法的分离与高度复用。STL的设计哲学强调类型安全、性能优化和代码复用,其价值在于让开发者从底层实现中解放出来,专注于业务逻辑。无论是数据处理、系统编程还是算法实现,STL都是现代C++工程实践的基石。本文以最常用的std::string为切入点,深入解析其内存管理、迭代器操作和性能优化等机制,并自然延伸到STL的六大组件,通过文本词频统计等实际案例,展示如何运

weixin_30470643的博客 452
上一篇: C++效率掌握之STL库:string函数全解
下一篇: 【初阶数据结构】先来后到的秩序:栈和队列
澪贰
澪贰 优质创作者: C/C++技术领域 优质创作者: C/C++技术领域
博客等级 码龄2年 1万+粉丝 222原创
评论 125
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值