【C++】STL之string类(2)

这篇具有很好参考价值的文章主要介绍了【C++】STL之string类(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓【C++】STL之string类(2),C++之路,c++,开发语言,stl

reserve

【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl
reverse:在不改变字符串内容的前提下,预留一定的内存空间。
具体来说,当我们调用 reserve(n) 函数时,字符串对象会在内部分配至少能够容纳 n 个字符的内存空间,但是并不会对字符串长度进行改变。这就可以避免对字符串多次进行扩充操作,从而提高更改字符串长度的效率。

使用 reserve 函数并不会改变字符串对象的长度,如果需要更改字符串长度,可以使用 resize() 函数来完成,这个函数也可以指定字符串对象的长度,并自动调整内存大小。
举个例子,请看:

//这个地方不一定会开50的空间,也有可能比50还大一点,但是一定会开大于等于50的空间
int main()
{
	std::string str = "Hello, World!";

	std::cout << "Before reserve, capacity = " << str.capacity() << std::endl;

	str.reserve(50);

	std::cout << "After reserve, capacity = " << str.capacity() << std::endl;

	return 0;
}

【C++】STL之string类(2),C++之路,c++,开发语言,stl
那现在我们来试一试reverse的空间容量会不会缩回去呢?请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
上面的实现是用vs来进行实现的,所以reverse空间并不会收缩,但是如果换Linux平台的话,可能就收缩了,所以reverse究竟收缩与否取决于平台,甚至是取决于不同平台下的不同版本。

resize

当我们调用 resize(n) 函数时,字符串对象会被调整为包含 n 个字符的大小。如果新的对象长度比原来对象长度要短,则被截断部分的字符会被删除。如果新的对象长度比原来对象长度要长,则被新增部分的字符将会填充为 ‘\0’ 字符。

resize() 可以接受两个参数,第一个参数表示新的字符串长度,第二个参数表示填充字符,如果忽略第二个参数,则默认填充字符为 ‘\0’。
还是来举个例子:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
如果我们想填充为x的话,我们可以这样,请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
当n比字符串数组小的时候,会对多余的数据进行删除,请看举例:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl
可以看到并不会缩容。

insert

【C++】STL之string类(2),C++之路,c++,开发语言,stl

还是来看举例:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
如果要使用迭代器的话,请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
但是如果我们不想要在第一个位置开始插入呢,我们想要在任意位置进行插入的话,我们可以使用指针的用法进行指针的加减,比如 str.insert(str.begin() + 5, 5, 'b');请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
我们可以看到insert确实好用,可以在任意位置进行插入,但是这样效率会非常低,因为既然insert可以在任意位置插入元素的话就需要挪动数据,我们已经知道挪动数据的效率是非常低的,所以insert还是少用为好。

erase

【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl
earse:用于删除字符串中的一部分。

string& erase (size_t pos = 0, size_t len = npos);

先来看第一个函数原型(string& erase (size_t pos = 0, size_t len = npos);),其中,pos 表示要删除的起始位置(默认从 0 开始),len 表示要删除的字符数。如果不传入参数,则默认删除整个字符串。

该函数返回一个引用,指向被删除部分的 string 对象本身。请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl

【C++】STL之string类(2),C++之路,c++,开发语言,stl

iterator erase (iterator p);

iterator erase (iterator p);,用于从指定位置(迭代器p所指向的位置)删除一个元素,并返回指向被删除元素后面的元素的迭代器。
position表示指向容器中要删除的元素的迭代器。
【C++】STL之string类(2),C++之路,c++,开发语言,stl

replace

string& replace(size_t pos, size_t len, const string& str);

string& replace(size_t pos, size_t len, const string& str);:用来替换字符串中的字符或子字符串。
其中,pos表示要替换的子字符串在源字符串中的起始位置,len表示要替换的子字符串的长度,str表示要替换成的目标字符串。
请看举例:
【C++】STL之string类(2),C++之路,c++,开发语言,stl

【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl

把所有空格替换为20%
【C++】STL之string类(2),C++之路,c++,开发语言,stl

c_str

c_str函数返回一个指向当前string对象所包含的字符串内容的C风格(即以’\0’结尾的字符数组)字符串的指针。

这个函数通常用于将string对象转换为C风格字符串,以便将其传递给一些C语言接口,因为这些接口可能无法处理C++的string对象。例如,在使用一些基于C的库的时候,我们可以使用c_str函数将string对象转换为字符数组来与这些库进行交互。

【C++】STL之string类(2),C++之路,c++,开发语言,stl
还是来举个例子来帮助大家来理解c_str,比如我们如何用C语言中的接口来打开这个文件呢:string filename = "test.cpp";,此时我们就需要一个C语言和C++中的一些衔接。
再比如,有一个string对象str,可以使用str.c_str()来返回一个指向C字符串的指针,请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl

find

【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl
我们先找到一个能够找到的例子,请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl

那如果我们找不到这里返回的应该是什么呢?
find函数返回一个size_t类型的位置信息,表示找到的子串的起始位置。如果没有找到指定子串,则返回一个特殊的常量std::string::npos,通常值为-1。

我们再来举个不能找到的例子,请看:
【C++】STL之string类(2),C++之路,c++,开发语言,stl
下面我们来做一个小题目:给定一个网址,将其中的协议 域名 资源名分别提取出来。请看:

int main()
{
	//https://legacy.cplusplus.com/reference/string/string/
	string ur1 = "https://legacy.cplusplus.com/reference/string/string/";
	//协议(protocol)  域名(domain)  资源名

	size_t pos1 = ur1.find("://");
	string protocol;
	cout << "pos1:" << pos1 << endl;
	if (pos1 != string::npos)
	{
		protocol = ur1.substr(0, pos1);
	}
	cout << "protocol:" << protocol << endl;//取协议

	size_t pos2 = ur1.find('/', pos1 + 3);
	string domain;
	string uri;
	if (pos1 != string::npos)
	{
		domain = ur1.substr(pos1 + 3, pos2 - (pos1 + 3));
		uri = ur1.substr(pos2 + 1);
	}
	cout << "domain:" << domain << endl;//取域名
	cout << "uri:" << uri << endl;//这里可以直接取资源名
	return 0;
}

【C++】STL之string类(2),C++之路,c++,开发语言,stl
【C++】STL之string类(2),C++之路,c++,开发语言,stl

find_first_of

find_first_of函数用于在字符串中查找第一个出现指定字符集合中任何一个字符的位置。
【C++】STL之string类(2),C++之路,c++,开发语言,stl

【C++】STL之string类(2),C++之路,c++,开发语言,stl

请看举例:

//find_first_of
//Maybe next year's situation will be very different from this year's.
int main()
{
	string str("Maybe next year's situation will be very different from this year's.");
	size_t found = str.find_first_of("aeiou");
	while (found != string::npos)
	{
		str[found] = '*';
		found = str.find_first_of("aeiou");
	}
	cout << str << endl;
	return 0;
}

【C++】STL之string类(2),C++之路,c++,开发语言,stl

好了,以上就是stl中string类的一些成员函数,就到这里吧。
再见啦,友友们!!!

【C++】STL之string类(2),C++之路,c++,开发语言,stl文章来源地址https://www.toymoban.com/news/detail-517717.html

到了这里,关于【C++】STL之string类(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++ • STL】探究string的源码

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" 浅拷贝 :也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,

    2024年02月08日
    浏览(40)
  • C++ [STL之string模拟实现]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了STL容器string的部分接口使用,有了string使我们对字符串的操作如鱼得水,其实string不止于使用方便,其实现也有许多我们值得学习的地方,本节将为您介绍string常用接口的代码实现! 本文接口的实现借助于C++官方

    2024年02月05日
    浏览(48)
  • 【C++精华铺】9.STL string

    目录 1. string类的优势 2. string类的常用接口 2.1 常用构造 1. 空串构造:string(); 2. C串构造:string(const char* s); 3. 拷贝构造:string(const string str); 4. 字符填充构造:string(size_t n, char c); 5. 迭代器构造:string(InputIterator first, InputIterator last); 2.2  string容量操作 1. size_t size(),size_t length

    2024年02月11日
    浏览(35)
  • 【C++】STL——string(两万字详解)

    🎇C++学习历程:STL——string学习 博客主页: 一起去看日落吗 持续分享博主的C++学习历程 博主的能力有限,出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记,树🌿成长之前也要扎根,也要在漫长的时光🌞中沉

    2024年01月25日
    浏览(43)
  • C++ STL string类模拟实现

    目录 string类成员变量 一.构造函数 二.析构函数 三.拷贝构造 四.size(),capacity() 五.operator [ ] 六. operator =  七.字符串比较  八.reserve() 九.push_back(),append() 十.operator+=  十一.insert()  十二.迭代器  十二.erase() 十三.swap()  十四.find() 十五.流提取,流输出 十六

    2024年02月14日
    浏览(51)
  • C++STL详解 string【C++】

    函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器 在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比

    2024年02月08日
    浏览(54)
  • 【C++】STL之string类(1)

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 接下来就开始STL部分的学习了,本文先来学习一下

    2024年02月11日
    浏览(37)
  • C++ [STL之string的使用]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 字符串在程序中经常出现,C语言为此提供了很多字符串操作函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问,于是STL单独为字符串实现了一个容器,

    2024年02月01日
    浏览(32)
  • 【C++初阶】8. STL初阶 + String类

    STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗 数据结构与算法的软件框架 。 原始版本 Alexander Stepanov、Meng Lee 在 惠普实验室 完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播

    2023年04月08日
    浏览(44)
  • c++学习:STL之string类初识

    目录 1.关于STL 1.什么是STL 2.STL的六的组件 2.关于string类的学习 1.为何学习string类 2.何为string类 3.string类对象的构造 4.容量操作  5.元素访问的操作 6.迭代器(Iterators) 7.修改类的操作  8.字符串操作 STL(standard template library-标准模板库):是c++标准库的重要组成部分,不仅是一

    2024年02月03日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包