string 详解

Delphi 中的字符串类型 string 详解 在 Delphi 7 中,字符串类型默认实现为 AnsiString,其内存结构包含引用计数、长度字段和以 NULL 结尾的字符数据。理论上字符串长度可达 2,147,483,647 字符(2GB),但实际受限于 32 位系统内存分配,通常不超过 512MB。使用时需注意:索引从1开始、避免直接操作内存、大文本建议使用 TMemoryStream 替代。关键特性包括自动内存管理、写入时复制机制,以及与 C 风格字符串的二进制兼容性。 阅读详情

string 详解


构造与析构

    相应的参数及作用如下图:

    在其中常用的要记住的是空串、字符串的子串、用单个字符重复填充,需要注意的是不能用单个字符进行只有一个参数的初始化,如 string(‘a’) 这样是不允许的。其中的string(beg, end)的用法的用ASCII码为 end 的字符 beg 初始化字符串,例如

string s(5, 97);
cout << s << endl;
//结果为 aaaaa,因为 a 的ASCII码为97,并重复五个

更改内容

    赋值=,assign;清除clear、erase;安插insert,在无符号整数时有时需强制转换;移除removing;

    swap交互内容的复杂的为O(n),当分配器相同时,直接交换控制信息

赋值
string& string::assign(const string& str)
string& string::assign(const char* cstr)
string& string::assign(const char* chars, size_type chars_len)
string& string::assign(size_type num, char c)
void string::swap(string& str)

添加字符
string & string::append(const string& str)
stirng& string::append(const string& str, size_type str_idx, size_type str_num)
string& string::append(const char* cstr)
string& string::append(const char* chars, size_type chars_len)
string& string::append(size_type num, char c)
string& string::append(InputIteracor beg, InputIterator end)

void string::push_back(char c)

安插
string& string::insert(size_type idx, const string& str)
string& string::insert(size_type idx, const& str, size_type str_idx, size_type str_num)
string& string::insert(size_type idx, const char* cstr)
string& string::insert(size_type idx, const char* chars, size_type chars_len)
string& string::insert(size_type idx, size_type num, char c)
void string::insert(iterator pos, size_type num, char c)
iterrator string::insert(iterator pos, char c)
void string::insert(iterator pos, InputIterator beg, InputIterator end)

删除
void string::clear()
string& string::erase()
string& string::erase(size_type idx)
string& string::erase(size_type idx, size_type len)
string& string::erase(iterator pos)
string& string::erase(iterator beg, iterator end)

改变容量大小
void string::resize(size_type num)
void string::resize(size_type num, char c)

替换
string& string::replace(size_type idx, size_type len, const string& str)
string& string::replace(iterator beg, iterator end, const string& str)
string& string::replace(size_type idx, size_type len, const string& str, size_type stri_icx, size_type str_num)
string& string::replace(size_type idx, size_type len, const char* cstr)
string& string::replace(iterator beg, iterator end, const char* cstr)
string& string::replace(size_type idx, size_type len, const char* chars, size_types chars_len)
string& string::replace(itertor beg, iterator end,const char* chars, size_type chars_len)
string& string::replace(size_type idx, size_type len, size_type num, char c)
string& string::replace(iterator bet, iterator end, size_type num, char c)
string& string::replace(iterator beg, iterator end, InputIerrator newBeg, InputIterator newEnd)

查

查大小

    其成员函数max_size()查询在物理机基础上能使用的大小,capacity()查询分配的能使用的大小,size()和length()查询现在使用了的大小;试验了一下看到其大小分配类似于动态数组,但其增长规律不了解

查字符

    string的查询可以单个字符查询,多个字符查询,多个字符中任意一个查询;前向和后向查询;任意位置开始查询,所有的函树如下图:

string2.png

比较

    除常规比较< 、> 、 <= 、 >= 、 == 这些,提供了成员函数compare()来扩展,它可以拥有子串的比较,还可以定制,具体如下:

函数的返回值是0,表示两字符相等;<0,表示当前字符串小于比较字符串;>0,表示当前字符串打印比较字符串

当前字符串与str进行比较
int string::compare(const string &str) const

把当前字符串从idx开始的最多len个字符与str进行比较,其中的str可为char*类型
int string::compare(size_type idx, size_type len, const string &str) const

把当前字符串从idx开始的最多len个字符与str从str_len开始的最多str_len个字符进行比较,其中的str可为char*类型
int string::compare(size_type idx, size_type len, const string &str, size_type str_idx, size_type str_len) const

子串

    substr();

对迭代器的支持

  • 大小写转换
  • 无视大小写的比较、搜索
  • 翻转
  • 排序

大小及容量

查询现有字符的个数,下面两个函数是等效的
size_type string::size() const
size_type string::length() const
判断字符串是否为空
bool string::empty() const
查询字符串可含有的最大字符数,与计算机的物理内存相关吧
size_type string::max_size() const
查询重新分配前能拥有的最大字符串,和动态数组类似
size_type string::capacity() const
重新分配内存时可以调用此函数来加快速度
void string::reserve()
void string::reserve(size_type num)

string 与 C-String的转换

    存在string向C-String的隐式转换,但不存在C-String向string的隐式转换。

    三个转换函数data、c_str、copy中,data和copy在转换后并不在其末尾添加结束符,c_str在其末尾添加结束符

    使用指针引用转换后的c_str时有注意,如果在之后string进行了增删改以后,指针的有效性就没有,也就是说指针所指的内容也发生了变化

需要注意的细节点

c++ string 与 C_string的转换,在初始化或赋值过程中的结尾问题

    在string中没有结束符一说,但是其是存在的,因为结束符等价于string::npos,为了在搜索的时候表示搜索到结束也没有。也就是说你查找‘\t’时是永远能查找到的
    在初始化过程中,总是会在字符串的末尾添加结束符,但其不会算在string的大小中,
在单参数版本中才将字符串结束符当特殊符号处理,其他不视为特殊符号,使用【】取值并不会越界,而使用at会报错越界。是与npos的设计有关,往往在其最后添加npos,已便于查询。详细如下面的情况:

    char* p = "test";
    cout << (int)('a') << endl;
    string test(p);
    cout << test << endl;
    cout << test.size() << endl;//在单参数传入中将忽略结束符,结果为4
    //下面的两行用【】取值很奇怪,平时也会遇到这样的情况
    cout << test[test.size()] << endl;//但是使用【】取结束符却是可以的
    cout << test[test.size()+1] << endl;//在下一就越界报错了
    cout << test.at(test.size()) << endl;//at需要检查越界,因为越界了所以报错
    string s2("test", 5);
    cout << s2.size() << endl;//双参数并指定了结束符,所以结果为5
    cout << s2[4] << endl;//合法
    cout << s2[5] << endl;//这个也可以,是结束符合法
    cout << s2[6] << endl;//不合法,越界

它的内存机制是什么样的,是二倍动态扩展,还是其他的如链表之类的,还是reserve()重新分配内存使用场景是什么样的,使用后的作用体现

    经过查资料和试验,证明其动态分配的规律如下(在win10,VS2015下试验):其初始大小为15,在前2次分配中每次增加16,之后每次增强其一般的值,试验的代码如下:

int main() {
    string s;
    cout << s.size() << ' ' << s.capacity() << endl;
    s += "1234567890123456";
    cout << s.size() << ' ' << s.capacity() << endl;
    s += "1234567890123456";
    cout << s.size() << ' ' << s.capacity() << endl;
    s += "1234567890123456";
    cout << s.size() << ' ' << s.capacity() << endl;
    s += "12345678901234567890123";
    cout << s.size() << ' ' << s.capacity() << endl;

    system("pause");
    return 0;
}

//输出如下:
0 15
16 31
32 47
48 70
71 105

元素存取【】与at的区别,在初始过程中最后索引元素的结束符,所以是有效的?

    【】存取中不会检查越界,而at会检查;但【】的效率比at高。在const string 中【】是无效的,会出错,而不是const string是可以的,其指向的值的结束符

size和length有区别没?

    基本等效,只是size是STL版本的,length是C的

避坑指南:在Linux服务器上用Conda安装antiSMASH 5.2.0(解决Jinja2报错和Matplotlib权限问题) 本文详细介绍了在Linux服务器上使用Conda安装antiSMASH 5.2.0的避坑指南,重点解决了Jinja2报错和Matplotlib权限问题。通过创建专用conda环境、安装指定版本依赖包和配置缓存目录,帮助用户顺利完成antiSMASH的本地部署,适用于批量处理基因组分析任务。 阅读详情

相关推荐

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

String详解

1 String 概述 2 String不可变的好处 3 String,StringBuffer和 StringBuilder的区别 4 字符串常量池(String Pool) 5 new String(String类中两种对象实例化的区别) 6 String 常用方法(字符串构造、String对象的比较 、字符串查找、转化、字符串替换、字符串拆分、字符串截取、其他操作方法)...

crazy_xieyi的博客 5727

report_delay_calculation/check_timing/report_annotated_parasitics/report_analysis_coverge

如何debug 一颗cell 或一段net 的delay, 常用的办法是用report_delay_calculation 报这颗cell 或这段net, 会得到形式如下的report, 从该report 中可以得到: 表头需要特别关注的是command, 确定report 的对象及加的option; From/To pin: cell 的input pin 和...

diedai7174的博客 1796

string的介绍和使用

233

work_hard423的博客 8119

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 865

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程

如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。

jackerjin123的博客 1799

【c++教程】2.2-字符串类型

字符串的存储方式 在程序中想要存储字符串,需要知道字符串从什么地方开始,到什么地方结束。也就是我们需要知道字符串的长度。 因此,存储字符串有两种方式,一种是设置一个结束标志,从开始一直往后寻找,等到寻找到结束标志的时候,则字符串结束。 另外一种存储字符串的方式,是在存储字符串的同时,用一个值去记录字符串的大小,也即是记录从开始到哪里字符串结束。 C风格字符串 c风格的字符串来源于c语言,在c++中仍然保留了,但是并不建议使用。c风格字符串也即是按照第一种方式进行的字符存储,通过寻找结束标志\0,来

程程之光 423

数据分析:蛋白质组的GO term的富集分析详解

在获取差异表达蛋白质的数据之后,依据蛋白质与基因的对应映射关系,开展GO(Gene Ontology)term的富集分析。通过这一分析流程,能够精准地识别出不同实验组中过表达基因所关联的显著富集的GO term通路。这些富集的GO term通路为后续的生物学研究提供了关键线索,有助于深入探究基因功能、揭示潜在的生物学机制,从而推动生物学发现的进程。

专注生信领域 1365

String类详解

String类算是比较特殊的类型了,作为初学者我们甚至把这个引用类型时不时当成基本类型来用,而且发现,竟然差不多。然而实际呢?我们太年轻,差的真的很多,今天就来详细讲一讲到底差在哪。 一、创建字符串的四种方式 1.直接赋值 直接赋值,在堆中的常量池中创建该字符串对象 String str1 = "HelloWorld"; 2.通过构造方法创建对象 在堆中创建对象,并把该对象的拷贝放到常量池中 String str2 = new String("HelloWorld"); 3.通过字符数组

weixin_65278827的博客 2万+

荒岛逃生游戏

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。

面试高手的博客 2101

5、基于模型的系统工程(MBSE)全面解析

本文全面解析了基于模型的系统工程(MBSE),介绍了模型在系统工程中的核心地位,以及如何通过视图和符号表示法实现信息的可视化。文章还详细阐述了MBSE的方法构成,包括框架(本体和视图点)和流程集,探讨了MBSE的实施流程、关键要素、应用策略以及未来发展趋势。通过合理应用MBSE,组织可以提高系统开发的效率和质量,降低成本与风险,实现成功部署。

nft7creator的博客 126

【C++】string介绍

string的一些介绍,最常用的几个函数和一些不常用的接口的示例。 这篇重点不在于记住这些函数接口,重点在于学会查文档。

You don't have the guts to be what you wanna be. 3211

手把手教你学Simulink——无刷直流电机(BLDC)霍尔传感器(Hall Sensor)信号处理电路仿真

在中,转子位置靠​ 给出,换相逻辑(Commutation Table)据此决定。实际霍尔输出是,且常有:比较迟滞(内置或外加分压)RC 低通(防 EMI 尖刺)与 MCU 间想让你霍尔三相 UVW 理想方波(120° each, 换相每 60°elec)经观察:原始 HU/HV/HW、滤波后波形、整形后 TTL 电平验证换相表(001→100→010…)与转子转向匹配是破局关键。

amy_mhd的博客 38

C++ string 详解

C++ string 详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一

NeWnIx 572

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++ string详解

C++ string 详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C+

在思索中前行! 2737

Devexpress16.2.6破解工具

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

String 在Java中的用法详解

认识String类 和 String的使用1、创建字符串:(1)常见的构造String的方式:(2)String的基本概念: 1、创建字符串: (1)常见的构造String的方式: ① 方式一: String str = "You are very cool!"; ② 方式二: String str = new String("You are very cool!"); ③ 方式三: char[] array = {'c','o','o','l'}; String str = new String(ar

小乔不掉发的博客 9178

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ string类详解

文章内容主要包括C++中string类的详细介绍

TTKunn的博客 1794

Java String详解(一)

对于Java来说String对象可以说是使用最频繁的,字符串对象在内存中占据了最大的空间快。我们平时在编程的时候经常使用String,也最容易忽略对于String的认识,因此深入的认识String有助于我们写出的代码更高效更安全。

晴空๓ 1056

C++ string 用法详解

转自:C++ String详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中

ubunfans的专栏 955

string.h 详解

string.h 简介 C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。 函数简介 函数 功能简介 memchr 在内存块中定位字符的位置 memcmp 把两个内存块的内容进行比较。 memcpy 复制内存块的内容 memmove 移动内存块中的内容 memset 以字节方式填充内存块 ...

ultraji的博客 4万+

Java【String类】的详解

Java【Sting类】的详解 🐲1.了解String类 🐲 2.String类常用方法 🦄 2.1 字符串构造 🦄2.2 字符串查找 🦄2.3 字符串截取 🦄2.4 字符串替换 🦄2.5 字符串拆分 🦄2.6 字符串修改 🦄2.7 相互转化 🦄2.8 String对象比较 🦄2.9 去除字符串左右空格 🐲 3. 字符串常量池 🦄 3.1 理解池的概率 🐲 4. 字符串不可变性 🐲 5. StringBuilderStringBuffer

m0_58761900的博客 2万+

Redis的String详解

Redis String是Redis最基本的数据类型,支持存储字符串、整数和二进制数据(最大512MB)。它采用三种编码方式(int、embstr、raw)自动优化存储,底层使用SDS结构实现O(1)长度获取和二进制安全。String类型提供丰富的原子操作命令,包括基本CRUD、批量操作、数值计算、字符串处理和位操作。其高效率和原子性特性使其广泛应用于缓存、计数器、分布式锁等场景。通过多种编码转换和内存优化策略,Redis String在性能和内存使用上达到良好平衡。

2301_81016208的博客 922
上一篇: FTP 编程 5 文件传输与目录切换
下一篇: C++的三种封装层级
_萧_
博客等级 码龄10年 55粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值