Cpp学习——string(2)

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

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

 

目录

​编辑

容器string中的一些函数

1.capacity()

2.reserve() 

3.resize()

4.push_back()与append()

5.find系列函数


容器string中的一些函数

1.capacity()

capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢?现在就来看一下。先写这样一段程序:

int main()
{
	string s ;
	int old = s.capacity();
	cout << "原来的容量:"<<old << endl;
	for (int i = 0;i < 100;i++)
	{
		s += 'c';
		if (s.capacity() != old)
		{
			cout << "扩容:" << s.capacity() << endl;
			old = s.capacity();
		}
	}
	return 0;
}

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

在这里可以看到除了第一次扩容以后,其它的扩容都是1.5倍扩容。可以说在vs环境下string扩容都是1.5倍扩容。但是为什么第一次扩容不是1.5倍扩容呢?这是因为在vs中要处理一些内存对齐的问题。所以,第一次扩容才不是1.5倍扩容。 

2.reserve() 

我们都知道,扩容是一件非常耗效率的事情。所以在程序中我们总是要去避免掉扩容。那我们有什么好办法去防止扩容呢?这还真有办法,就是使用reserve()函数。但是这个办法要在你知道大概要开多少空间的情况下使用。比如上面的程序,我知道要开一百个字节的空间。所以我就这样操作:

int main()
{
	string s ;
	int old = s.capacity();
	cout << "原来的容量:"<<old << endl;
	s.reserve(100);//预开一百个字节的空间
	for (int i = 0;i < 100;i++)
	{
		s += 'c';
		if (s.capacity() != old)
		{
			cout << "扩容:" << s.capacity() << endl;
			old = s.capacity();
		}
	}
	return 0;
}

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

 这样便有效的避免了多次扩容。

这里要注意的一点是,reverse()函数是不能够缩小空间的

3.resize()

 resize()函数相当于是reserve()加上初始化。resize()函数有两种形式:1.resize(size),2.resize(size,char)。第一种形式的参数只有要开的长度,于是resize()会默认初始化开辟的空间里的数据为'\0'。第二种形式要传的参数便是要开辟的空间的大小与初始化这段空间的值。并且这个函数会自动扩容。如下列程序:

string s ;
s.resize(100);
cout << s << endl;
return 0;

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

这时因为'\0'不会显示出来。

再比如下列程序:

string s ;
s.resize(100,'c');
cout << s << endl;
return 0;

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

 

4.push_back()与append()

push_back()函数是干嘛的相信大家都懂。这个函数实现的便是一个尾插的功能,实现的就是一个一个字符的尾插。比如我要将x插入到s中:

 

string s ;
s.resize(3,'c');
s.push_back('x');
cout << s << endl;
return 0;

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

但是如果我要插入字符串xxxxx呢?这时push_back()可解决不了了。此时就得append()上场了:

string s ;
s.resize(3,'c');
s.append("xxxxx");
cout << s << endl;
return 0;

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

 

5.find系列函数

 find(char*/char):这个函数实现的功能是从字符串的头往尾找。找到了要找的字符串便返回字符所在的下标。比如我要找一个.cpp文件的后缀:

int main()
{
	string s = "text.cpp";
	int i = s.find('.');
	cout << s.substr(i) << endl;
}

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

成功找到。

但是,如果现在我要找的是text.cpp.zip的文件后缀呢?此时就得rfind()上场了,rfind(char*/char) :

这个函数实现的功能是和find()函数相反的。它实现的功能是从后往前查找字符,找到字符后也是返回字符所在下标。对于找text.cpp.zip文件的后缀,代码如下:

int main()
{
	string s = "text.cpp.zip";
	int i = s.rfind('.');
	cout << s.substr(i) << endl;
}

结果:

Cpp学习——string(2),C++基础,学习,c++,学习笔记,笔记,Cpp

再比如说我要找到一个网址的协议,域名,资源名该怎么找呢?比如这个网址:

 

https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217

这个网址的协议是:https

域名是:mp.csdn.net

资源是:/mp_blog/creation/editor?spm=1011.2415.3001.6217

我们该怎么办呢?其实挺简单的,代码如下:

string s = "https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217";
	int begin = 0;
	int end = 0;

	end = s.find(":");
	cout << "协议:"<<s.substr(begin, end) << endl;

	begin = end + 3;
	end = s.find("/",begin);
	cout <<"域名:"<< s.substr(begin, end) << endl;

	cout << "资源名:"<<s.substr(end) << endl;

关键是要调整寻找的范围。比如第一次找到协议以后,便跳过协议和"//"到后面去找。

find_first_of(char*/char):这个函数能实现找到要找的字符串里的任何一个字符并返回该字符的下标。如:

string s = "https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217";
	cout <<"修改前:"<< s << endl;
	std::size_t found = s.find_first_of("aeiou");
	
	while (found != std::string::npos)
	{
		s[found] = '*';
		found = s.find_first_of("aeiou", found + 1);
	}
	cout <<"修改后:"<< s << endl;

find_last_of(char*/char):功能与find_firsy_of一样,但是顺序是从后往前找。文章来源地址https://www.toymoban.com/news/detail-631679.html

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

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

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

相关文章

  • Java String基础学习

    目录 1、String的构造方法 2、String内存模型 3、字符串的比较 4、字符串的练习 1、用户登录系统 2、遍历字符串 3、统计字符次数 4、拼接字符串 5、字符串的反转 6、金额转换 7、手机号屏蔽 * 8、身份证信息查看 9、敏感词替换 5、StringBuilder 1、概念及练习 2、链式编程思想 3、小

    2024年01月21日
    浏览(26)
  • String类的学习笔记(上):介绍String类及其常用方法的使用

    本文介绍了Java中用来描述操作字符串的String类,和其一些常用的基本操作方法,字符串的创建输出,字符串对象的比较,字符串查找,字符串的转化,字符串的替换,字符串拆分,字符串截取,和大小写转换,去除左右空格,子字符串包含,学会使用这些方法,能更方便的使用操作字符串~ 前言

    2023年04月23日
    浏览(43)
  • String类的学习笔记(下):字符串拼接以及StringBuilder和StringBuffer的学习

    本文介绍了String类对字符串进行拼接的方法 和拼接字符串的效率分析 以及能对字符串内容进行修改的StringBuilder和StringBuffer类其常用方法和区别 , 最后介绍了两个字符串经典面试题 1.String常用方法学习-2.String的不可变和字符串常量池-StringBuilder和StringBuffer String类是Java中用来描

    2024年02月05日
    浏览(43)
  • cpp primer笔记030-参数传递

    CPP允许将变量定义成数组的引用 CPP的initializer_list允许构建一个类似于CS的param数组,但是要求数组类型相同 CPP可以用列表初始化返回值。 CPP可以使用一下两种方式创建一个返回数组指针的函数,其中第一个方式叫尾指返回类型声明,可以用这个方法返回函数指针。 预处理器

    2024年02月07日
    浏览(25)
  • Cpp基础Ⅰ之编译、链接

    工具:Visual Studio 在 .cpp 源文件中,所有 # 字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #includeiostream 就是一个预处理语句(pre-process statement),编译器在加载源文件的时候,识别到 # 开头的语句,会优先处理这个语句,所以称为预处理语句。 注意:预处理语

    2024年02月12日
    浏览(27)
  • 机器人CPP编程基础-04输入Input

    机器人CPP编程基础-03变量类型Variables Types  ……AI……       C++中,输入是通过标准输入流(stdin)进行的,通常使用cin对象来实现。cin对象是istream类的实例,它提供了许多输入方法来读取不同类型的数据。 以下是一些常用的C++输入方法: 读取字符: cpp复制代码 char ch; ci

    2024年02月13日
    浏览(32)
  • 机器人CPP编程基础-02变量Variables

    机器人CPP编程基础-01第一个程序Hello World 基础代码都可以借助人工智能工具进行学习。 该代码主要执行以下操作: 声明一个名为  A  的整数类型变量,并将其初始化为  4 。在 C++ 中, int  类型通常占用 4 个字节的内存空间。 使用  cout  语句输出变量  A  的值,即  4 。

    2024年02月13日
    浏览(32)
  • 机器人CPP编程基础-05完结The End

    非常不可思议……之前四篇博文竟然有超过100+的阅读量…… 此文此部分终结,没有继续写下去的必要了。 插入一个分享: 编程基础不重要了,只要明确需求,借助AI工具就能完成一个项目。 当然也不是一次成功,工具使用也需要技巧。  但是基于上述案例而言,传统的编程

    2024年02月13日
    浏览(28)
  • 【C++】开源:abseil-cpp基础组件库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍abseil-cpp基础组件库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/abseil/abseil-cpp 官网:

    2024年02月13日
    浏览(38)
  • 机器人CPP编程基础-03变量类型Variables Types

    机器人CPP编程基础-02变量Variables 全文AI生成。 该代码是用C++编写的,它包含了各种数据类型的声明和初始化,以及如何使用 cout 语句来打印这些变量的值和地址。下面是每行的详细解析: 以上就是对这段代码的详细解析。 #includeiostream : 包含输入/输出流的库。这使得程序可

    2024年02月13日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包