首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

C++ 中 std::string

C++ 在其定义中有一种将字符序列表示为 class 对象方法。这个类叫做 std::stringString 类将字符存储为具有允许访问单字节字符功能字节序列。 ...std:: 字符串与字符数组 字符数组只是一个可以由空字符终止字符数组。字符串是定义表示为字符流对象类 字符数组大小必须静态分配,如果需要,不能在运行时分配更多内存。...实现字符数组是快比std :: string。与实现相比,字符串比字符数组慢。 字符数组不提供很多内置函数来操作字符串。String 类定义了许多允许对字符串进行多种操作功能。...The string after pop_back operation is : juejiner 容量函数 4. capacity()  :- 该函数返回分配给字符串容量,该容量可以等于或大于字符串大小...分配了额外空间,以便在将新字符添加到字符串时,可以有效地完成操作。 5. resize()  :- 这个函数改变字符串大小大小可以增加或减少。

1.1K20

C++踩坑记录(一)std:;string析构

越学C++越觉得自己菜了 之前写服务端程序有一个往消息队列里面推json过程,然后发现推进去C#端取到无论如何都是个空指针 简单复现一下现场 string str1 = string("hello1..."); string str2 = string("hello2"); const char* ptr1 = str1.substr(1).data(); // 取字符串从下标1到结尾部分 const...执行到到了下一行时候,存储str1子串字符串对象被析构,msvc发现这是个临时对象,代码块还没结束十好几就把内存析构掉,临时对象内存被释放,同时str2.substr(1),这个时候新临时变量被注册到刚才...str1.substr(1)被析构掉内存地址上面,此时再去调用data(),拿到了ptr1同一个地址指针,此时内存数据变更为s2子串,然后压到消息队里面的数据穿就乱了,当我把程序增加一个临时string...去接收上面产生子串时候,问题就会解决了 string str1 = string("string1"); string str2 = string("string2"); string t_str1

2.1K20

string函数讲解

类对象容量操作 我们这里size和lenth作用是一样,只是在后期语言发展中为了适应需要,例如,如果是一个二叉树,用lenth合适,所以就引出了size 注意,这里计算出来是有效字符个数...size() << endl; return 0; } 大家可以发现: 用reserve来提前开辟空间,capacity改变,size不变,而用resize则是capacity和size都会发生改变...clear()只是将string中有效字符清空,不改变底层空间大小。...注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变。...reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve参数小于 string底层空间总大小时,reserver不会改变容量大小

4710

【STL】string使用

与size相同,推荐使用size capacity 空间总大小 empty 字符串是否为空,空返回true,非空返回false clear 清空有效字符 reserve 进行扩容,改变是总空间大小...,直接影响capacity resize 对有效字符进行扩容,改变是size大小,可能间接影响capacity size与capacity 我们来看,size为有效字符长度大小,capacity...如下图: clear与empty就不用多说了,这里需要注意是,clear只是将有效字符第一个字符设置成\0,不会改变总空间大小,但是影响size,因为size计算是有效字符串长度,遇到\0...reserve与resize 两者都是扩容,不同是,reserve改变总空间大小,而resize改变是有效字符大小。如下: reserve进行空间扩容时,采用异地扩容 。...而Linux频繁扩容,导致内存碎片问题,因此VS策略更加合理一些。另外,我们在使用string时,如果能提前计算出所需要空间,直接reserve提前扩容,提高一定运行效率。

14530

C++从入门到精通——string

clear()只是将string中有效字符清空,不改变底层空间大小。...注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变。...reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve参数小于string底层空间总大小时,reserver不会改变容量大小。...在vector和string等容器中都可以使用reserve()函数。 resize() ps:resize()影响size 在C++中,resize()函数用于改变容器对象大小。...如果原来容器大小大于10,那么resize()函数将删除容器末尾多出元素,使得容器大小为10。 对于string字符串来说,resize()函数也可以用来改变字符串大小

10210

现代C++之容器

如果需要改变调用者字符串内容,使用 string& 作为参数类型(通常不推荐)。...第三个时发现空间不足,系统请求更大空间,大小由实现决定(比如两倍)。有了足够空间后,就会在新空间第三个位置构造(第三个obj1),成功之后再把头两个拷贝或移动过来。...2.2 resize与reserve 两者区别 vector reserve增加了vectorcapacity,但是它size没有改变!...所以在没有添加新对象之前,不能引用容器内元素。加入新元素时,要调用push_back()/insert()函数。 (2)resize是改变容器大小,且在创建对象。...为什么需要这么一个阉割版 list 呢? 原因是,在元素大小较小情况下,forward_list 能节约内存是非常可观;在列表不长情况下,不能反向查找也不是个大问题。

1K10

c 线程安全单例模式-std string与线程安全_这才是现代C++单例模式简单又安全实现

前言   说到单例模式,很多人可能都已经很熟悉了,这也是面试常问一个问题。对于单线程而言c 线程安全单例模式,单例实现非常简单,而要写出一个线程安全单例模式,曾经有很多种写法。...有兴趣可以参考这篇文章《单例模式很简单?但是你真的能写对?》   简单实现   该文章中也提到c 线程安全单例模式,由于C++11及以后版本中,默认静态变量初始化是线程安全。   ...delete; protected: Singleton() = default; ~Singleton() = default; };   示例   举个简单例子来看下吧...Singleton() = default; ~Singleton() = default; }; class Test:public Singleton {public:void myprint(){std

60140

C++初阶:初识STL、String类接口详细讲解(万字解析)

在执行字符串操作后,capacity() 返回值可能大于 size() 返回值,因为 size() 表示实际存储字符数,而 capacity() 表示分配总空间 int main() { string...reserve(): 函数: void reserve(size_t n); 功能说明: 用于为字符串预留至少 n 个字符存储空间,即提前分配足够空间,但并不改变字符串实际大小。...如果 n 大于当前容量,reserve 可能导致内存重新分配,否则,它只是更新容量而无需重新分配内存 注意事项: reserve 不影响字符串实际大小,即 size() 值不会改变。...如果 n 大于当前容量,reserve 可能导致重新分配内存,但并不会初始化新分配部分 n 大于原字符串 capacity,此时 reserve 函数会将 capacity 扩容到 n; n 小于等于原字符串...修改字符串实际大小,即 size() 变为 n。

11810

【C++】探索STL中高效容器:vector

也就是意味着可以采用下标对vector元素进行访问,和数组一样高效。但是又不像数组,它大小是可以动态改变,而且它大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它元素。...<< v1.empty() << endl; //v1是否为空 return 0; } 结果如下: 对于reserve()函数与resize()函数与之前学习过string类类似: reserve...对于vector可能导致其迭代器失效操作有: 会引起其底层空间改变操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。...}; auto it = v.begin(); // 将有效元素个数增加到100个,多出位置使用8填充,操作期间底层扩容 v.resize(100, 8); // reserve作用就是改变扩容大小但不改变有效元素个数...指定位置元素删除操作–erase erase删除pos位置元素后,pos位置之后元素往前搬移,没有导致底层空间改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos

7100

10分钟让你掌握vector

也就是意味着 可以采用下标 对 vector 元素进行访问,和数组一样高效。但是又不像数组,它 大小是可以动态改变 ,而且它 大小会被容器自动处理 。 3....而在这两个函数中reserve主要改变vector空间大小实现空间开辟,空间扩容。...会引起其底层空间改变操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、 push_back等。...作用就是改变扩容大小但不改变有效元素个数,操作期间可能会引起底层容量改变 // v.reserve(100); // 插入元素期间,可能会引起扩容,而导致原空间被释放 // v.insert...v.erase(pos); cout << *pos << endl; // 此处导致非法访问 return 0; } erase删除pos位置元素后,pos位置之后元素往前搬移,没有导致底层空间改变

10610

vector介绍与使用【C++】

也就是意味着可以采用下标对vector元素进行访问,和数组一样高效。但是又不像数组,它大小是可以动态改变,而且它大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它元素。...capacity 获取容量大小 empty 判断是否为空 resize(重点) 改变vectorsize reserve (重点) 改变vectorcapacity capacity代码在vs...对于vector可能导致其迭代器失效操作有: 引起底层空间改变 会引起其底层空间改变操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等...作用就是改变扩容大小但不改变有效元素个数,操作期间可能会引起底层容量改变 // v.reserve(100); // 插入元素期间,可能会引起扩容,而导致原空间被释放 // v.insert...string迭代器失效 与vector类似,string在插入+扩容操作+erase之后,迭代器也失效 #include void TestString() { string s(

6410

C++ vector 使用详解(含C++20新特性)

参考链接: C++ Vector元素改变时Iterator失效 目录  介绍两个关键词  元素访问  迭代器  容量  修改操作  emplace() & emplace_back()  std::erase...如果元素数目是预先已知,调用 reserve() 函数可以消除重新分配。 ...对于非空容器,返回指针等于第一个元素地址。如果 size() 为0,则 data() 可能或可能不会返回空指针。 ...begin、end 与 cbegin、cend区别是后者是指向常量指针,在使用过程中不允许改变指向内容值。此元素充当占位符;尝试访问它会导致未定义行为。 ...如果当前大小大于 count,则容器将缩小为其第一个 count 元素。如果当前大小小于 count,需要附加额外拷贝值 value。

1.7K30

C++初阶:容器(Containers)vector常用接口详解

介绍完了string相关内容后:C++初阶:适合新手手撕string类(模拟实现string类) 接下来进入新的篇章,容器vector介绍: 1.vector初步介绍 翻译过来就是: vector...也就是意味着可以采用下标对vector元素进行访问,和数组一样高效。但是又不像数组,它大小是可以动态改变,而且它大小会被容器自动处理 本质讲,vector使用动态分配数组来存储它元素。...获取容量大小 empty 判断是否为空 resize 改变vectorsize reserve 改变vectorcapacity capacity代码在vs和g++下分别运行会发现,vs下capacity...resize在开空间同时还会进行初始化,影响size 5.2reserve() reserve 函数用于改变容器容量,即修改容器内部用于存储元素空间大小。...; v.reserve(5); cout << v.capacity() << endl; } int main() { test5(); } 5.2resize() resize 函数用于改变容器大小

11510
领券