一文搞懂C++中string容器的构造及使用

目录
  • string容器
    • string基本概念
    • string构造函数
    • string赋值操作
    • string拼接操作
    • string查找替换
    • string字符串比较
    • string字符读取
    • string插入和删除
    • string求子串

string容器

string基本概念

本质:

string是c++风格的字符串,不同于c语言的 char*,他本质是一个类

string 和 char*的区别:

char*是一个指针

string是一个类,类内部封装了char*来管理字符串,是一个char&型的容器

特点:

strint类内部封装了很多成员方法

例如:查找find,拷贝copy,删除delete,替换replace,插入insert

string管理char*所分配的内存,不用考虑赋值越界和取值越界等问题,由类内部进行负责

string构造函数

四种函数原型

  • string()创建一个空的字符串
  • string(const char* s)使用字符串s初始化
  • string(const string& str)使用一个string对象初始化另一个string对象
  • string(int n,char c)使用n个字符c初始化

使用示例:

//string的构造函数
void test1()
{
    string s1;//默认构造
    const char* str = "叶落 秋白";
    string s2(str);
    cout << "s2:"<<s2 << endl;
    string s3(s2);
    cout << "s3" << s3 << endl;
    string s4(6,'a');
}

上面就是四个构造方法对应的举例了,第一种方式是我们频繁使用的;第二种方式就是设置不可变字符数组传入构造来初始化;第三种方式理解为调用拷贝构造即可;第四种方式就比较有意思了,在上面代码里的意思就是用6个'a'来初始化字符串,输入s4结果为:aaaaaa。

string赋值操作

给string字符串赋值

赋值的函数原型:

  • string& operator = (const char* s)char*类型字符串 赋值给当前的字符串
  • string& operator = (const string &s)把字符串s赋给当前的字符串
  • string& operator = (char c)把字符赋值给当前的字符串
  • string& assign(const char* s)把字符串s赋值给当前的字符串
  • string& assign(const char*s,int n)把字符串s的当前n个字符赋给当前的字符串
  • string& assign(const string &s)把字符串s赋给当前字符串
  • string& assign(int n,char c)用n个字符c赋给当前字符串

使用示例:

void test2()
{
	string str1;
	str1 = "叶落秋白";
	cout << "str1=" << str1 << endl;

	string str2;
	str2 = str1;
	cout << "str2=" << str2 << endl;

	string str3;
	str3 = 'c';
	cout << "str3=" << str3 << endl;

	string str4;
	str4.assign("hello c++");
	cout << "str4=" << str4 << endl;

	string str5;
	str5.assign("hello c#",5);
	cout << "str5=" << str5 << endl;

	string str6;
	str6.assign(str5);
	cout << "str6=" << str6 << endl;

	string str7;
	str7.assign(6, 'w');
	cout << "str7=" << str7 << endl;
}

tips:stirng赋值方法很多,但是重载的operator=的方式最为常用

string拼接操作

在字符串末尾拼接字符串

函数原型:

  • string& operator+=(const char* str)重载+=操作符
  • string& operator+=(const char c)重载+=操作符
  • string& operator+=(const string& str)重载+=操作符
  • string& append(const char* s)把字符串s连接到当前字符串结尾
  • string& append(const char* s,int n)把字符串s的前n个字符连接到当前字符串的结尾
  • string& append(const string &s)同operator+=(const string& str)
  • string& append(const string &s,int pos,int n)把字符串s中从pos开始的n个字符连接到字符串结尾

使用示例:

void test3()
{
	string str1 = "红豆";
	str1 += "忆相思";
	cout << "str1=" << str1<< endl;

	str1 += '?';
	cout << "str1=" << str1 << endl;

	string str2 = "yyds";
	str1 += str2;
	cout << "str1=" << str1 << endl;

	string str3 = "You";
	str3.append("low");
	cout << "str3=" << str3 << endl;

	str3.append("wuwuwu qaq", 4);
	cout << "str3=" << str3 << endl;

	str3.append(str2);
	cout << "str3=" << str3 << endl;

	str3.append(str2, 0, 1);
	cout << "str3=" << str3 << endl;
}

tips:初学者只需要稍微记几个拼接函数即可

string查找替换

指定位置查找字符串

指定位置删除字符串

函数原型:

1.查找s第一次出现位置,从pos开始查找

int find(const string& str, int pos = 0) const;
int find(const char* s , int pos ==0) const;

2.从pos位置查找s的前n个字符第一次位置

int find( const char* s, int pos, int n) const;

3.查找字符c第一次出现位置

int find(const char c, int pos = e) const;

4.查找str最后一次位置,从pos开始查找

int rfind(const string& str, int pos = npos) const;

5.查找str最后一次位置,从pos开始查找,计数永远是从前往后

int rfind(const char* s, int pos = npos) const;

6.从pos查找s的前n个字符最后一次位置

int rfind(const char* s, int pos, int n) const;

7.查找字符c最后一次出现位置

int rfind(const char c, int pos - e) const;

8.替换从pos开始n个字符为字符串str

string& replace(int pos, int n, const string& str);

9.替换从pos开始的n个字符为字符串s

string& replace(int pos, int n,const char* s );

使用示例:

//字符串的查找和替换
//查找
void test4()
{
	string str1 = "abcdefgh";
	//找到返回下标,找不到返回-1
	int pos1 = str1.find("def");
	cout << "pos1=" << pos1 << endl;
	int pos2 = str1.find("s");
	cout << "pos2=" << pos2<< endl;

	pos1 = str1.rfind("ab");//从右往左找到第一个出现,从左往右计数
	cout << "pos1=" << pos1 << endl;;
}
//替换
void test5()
{
	string str2 = "abcdef";
	str2.replace(1, 2, "1111");//从1号位置起,2个字符替换为1111
	cout << "str2=" << str2 << endl;
}

tips:

find找到字符串后返回查找的第一个字符位置,找不到返回1

函数虽然很多,但几乎都是两个版本的,一个是c++风格一个c语言风格

string字符串比较

字符串比较是按字符的ASCII码进行对比

函数原型:

int compare(const string &s) const;
int compare(const char* s) const;

使用示例:

string str1 = “zello”;
string str2 = “hello”;
if (str1.compare(str2) == 0)
{
cout << “相等” << endl;
}
else if (str1.compare(str2) > 0)
{
cout << “str1大” << endl;
}
else
{
cout << “str2大” << endl;
}

tips:字符串对比的目的是比较两个字符串是否相等,判断谁大谁小的意义并不是很大。

string字符读取

单个字符存取有两种方式:

函数原型:

char& operator[] (int n); //通过[]获取字符
char& at (int n); //通过at方法获取字符

使用示例:

string str1 = “hello”;
//通过[]访问单个字符
for (int i = 0; i < str1.size(); i++)
{
cout << str1[i] << " ";
}
cout << endl;
//通过at方式访问的单个字符
for (int i = 0; i < str1.size(); i++)
{
cout << str1.at(i) << " ";
}
cout << endl;
//修改单个字符
str1[0] = ‘z';
cout << str1 << endl;
str1.at(0) = ‘x';
cout << str1 << endl;

string插入和删除

函数原型:

string& insert(int pos,const cahr* s);//在n位置插入字符串
string& insert(int pos,const string& s);//在n位置插入字符串
string& insert(int pos,int n,char c);//在指定位置插入n个字符c
string& erase(int pos,int n = npos);//删除从pos位置开始的n个字符

使用示例:

string str = “hello”;
//插入
str.insert(1, “111”);
cout << "str = " << str << endl;
//删除
str.erase(1,3);
cout << "str = " << str << endl;

tips:插入和删除的起始下标都是从0开始。

string求子串

从字符串中得到想要的子串

函数原型:

string substr(int pos=0,int n=npos) const ;//返回由pos位置开始的由n个字符组成的字符串

//string求子串
void test01()
{
    string str = "abcdef";
    string subStr = str.substr(1, 3);
    cout << "subStr=" << subStr << endl;
}
//使用操作
void test02()
{
    string email = "ylqb@qq.com";
    //从邮箱地址中获取用户名信息
    int pos = email.find("@");
    string usrName = email.substr(0, pos);
    cout << usrName << endl;
}

tips:灵活的运用求子串功能,可以在实际开发中获取有效的信息,在上述代码中就可以有效获取到不同邮箱中的用户名。

到此这篇关于一文搞懂C++中string容器的构造及使用的文章就介绍到这了,更多相关C++ string容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++示例讲解string容器

    目录 string基本概念 string初始化 string赋值操作 string字符串拼接 string基本概念 本质: string是c++风格的字符串,而string本质上是一个类 string和char*区别 char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器 特点: string类内部封装了很多成员方法 例如: 查找find,拷贝copy,删除delete.替换replace.插入 insert string管理char*所分配的

  • 一起来看看C++STL容器之string类

    目录 前言 1.标准库中的string类 2.string类的常用接口说明 2.1string对象的常见构造 2.2string类对象的容量操作 2.2.1reserve是如何开辟空间的 2.2.2clear和empty 2.2.3resize的用法 2.3string类对象的访问以及遍历操作 范围for的使用 2.4string类对象的修改操作 2.4.1push_back和append以及operator+= 2.4.2 find和rfind以及substr 2.5string非成员函数重载

  • C++string容器基本概念详解

    string基本概念 本质: string是C++风格的字符串,而string本质上是一个类 string和char*区别: char*是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器. 特点: string类内部封装了很多成员方法 例如:查找find,拷贝copy,删除delete,替换replace,插入insert string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责. string构造函数 #includ

  • 一文搞懂C++中string容器的构造及使用

    目录 string容器 string基本概念 string构造函数 string赋值操作 string拼接操作 string查找替换 string字符串比较 string字符读取 string插入和删除 string求子串 string容器 string基本概念 本质: string是c++风格的字符串,不同于c语言的 char*,他本质是一个类 string 和 char*的区别: char*是一个指针 string是一个类,类内部封装了char*来管理字符串,是一个char&型的容器 特点:

  • 一文搞懂Redis中String数据类型

    概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的Value最多可以容纳的数据长度是512M. 相关命令列表: 命令原型 时间复杂度 命令描述 返回值 APPEND O(1)  如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾.如果该Key不存在,APPEND命令将会创建一个新的Key/Value. 追加后Va

  • 一文搞懂Spring中的注解与反射

    目录 前言 一.内置(常用)注解 1.1@Overrode 1.2@RequestMapping 1.3@RequestBody 1.4@GetMapping 1.5@PathVariable 1.6@RequestParam 1.7@ComponentScan 1.8@Component 1.9@Service 1.10@Repository 二.元注解 @Target @Retention @Documented @Inherited 三.自定义注解 四.反射机制概述 4.1动态语言与静态语

  • 一文搞懂Spring中Bean的生命周期

    目录 一.使用配置生命周期的方法 二.生命周期控制——接口控制(了解) 小结 生命周期:从创建到消亡的完整过程 bean声明周期:bean从创建到销毁的整体过程 bean声明周期控制:在bean创建后到销毁前做一些事情 一.使用配置生命周期的方法 在BookDaoImpl中实现类中创建相应的方法: //表示bean初始化对应的操作 public void init(){ System.out.println("init..."); } //表示bean销毁前对应的操作 public v

  • 一文搞懂Spring中@Autowired和@Resource的区别

    目录 1.来源不同 2.依赖查找顺序不同 2.1 @Autowired 查找顺序 2.2 @Resource 查找顺序 2.3 查找顺序小结 3.支持的参数不同 4.依赖注入的支持不同 5.编译器提示不同 总结 @Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解.它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它. @Autowired 和 @Resource 的区

  • 一文搞懂Java中的反射机制

    前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,自己掌握好节奏就好. 好了,言归正传. 反射机制是Java中的一个很强大的特性,可以在运行时获取类的信息,比如说类的父类,接口,全部方法名及参数,全部常量和变量,可以说类在反射面前已经衣不遮体了(咳咳,这是正规车).先举一个小栗子

  • 教你一文搞懂Kotlin中的Jvm注解

    JvmOverloads 创建一个kotlin的类 class Student(val name: String, val sex: Int = 1, val age: Int = 18) 可以看出来 这个构造函数的参数是有默认值的,kotlin的特性对吧,我们在使用的时候可以方便的使用,比如: val student = Student("wuyue") val student2 = Student("wuyue", age = 18) 但是这个特性如果你用jav

  • 一文搞懂Spring中的Bean作用域

    目录 概述 Singleton prototype request session application 概述 scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. Spring容器bean的作用域类型: singleton:Spring IoC 容器的单个对象实例作用域都默认为singleton prototype:针对声明为拥有prototyp

  • 一文搞懂Java中的注解和反射

    目录 1.注解(Annotation) 1.1 什么是注解(Annotation) 1.2 内置注解 1.3 元注解(meta-annotation) 1.4 自定义注解 2.反射(Reflection) 2.1 反射和反射机制 2.2 Class类的获取方式和常用方法 2.3 反射的使用 1.注解(Annotation) 1.1 什么是注解(Annotation) 注解不是程序本身,可以在程序编译.类加载和运行时被读取,并执行相应的处理.注解的格式为"@注释名(参数值)",可以附加在

  • 一文搞懂SpringMVC中@InitBinder注解的使用

    目录 简介 应用示例 原理解读 环境:Springboot2.4.12 简介 ​@Controller或@ControllerAdvice类可以有@InitBinder方法来初始化WebDataBinder的实例,这些方法可以: 将请求参数(即表单或查询数据)绑定到模型对象. 将基于字符串的请求值(如请求参数.路径变量.头.cookie等)转换为控制器方法参数的目标类型. 渲染HTML表单时,将模型对象的值格式化为字符串值. @InitBinder方法可以注册控制器特定的java.bean.Pr

随机推荐