(C++基础_STL) —— string类的基本应用

Posted 赵萱婷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(C++基础_STL) —— string类的基本应用相关的知识,希望对你有一定的参考价值。

(C++基础_STL) —— string类的基本应用

     在日常的C++开发过程中,我们会经常使用到STL最为赋能加速开发的一个基本库,那么在有一定的C++的语言的基础上,学习如何使用STL是一件非常有益与后续有益于自己面对更加复杂的需求和日常开发赋能的,因此,本人虽然工作了有一段时日了,准备开始写一系列专栏记录自己重温STL的一些用法,并加深自己对于STL的理解和运用的过程,本系列文章主要用于自己复习和参考使用,如果您看到感兴趣了也可以跟我一并一起进一步学习和探讨。

     个人编写的项目地址如下:UsingSTLEx

0 个人介绍

作者: 赵萱婷
简介: 一个在工业软件领域摸爬滚打的新人,毕业于华科软院的一个普通人,希望未来能够在工业设计软件领域深耕越走越远的软件工程师。
个人格言:用心去感受你自己需要坚持的生活,未来慢慢会给你答案的。
知乎:https://www.zhihu.com/people/Tom_Zhao
STL项目地址: https://gitee.com/zhaotianyuCoding/using-stlex

string容器

1. string的基本概念

     string从本质上来讲,stringC++风格的字符串,而string本质上是一个类。关于stringC语言中char *的区别有:

  1. char * 是一个指针;
  2. string 是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。

     因此string的特点概括起来可以有:

  • string 类内部封装了很多成员方法;

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

  • string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责;

2. string的构造函数案例

     目前string的构造函数原型有:

  1. string(); //创建一个空的字符串 例如: string str;
  2. string(const char* s); //使用字符串s初始化
  3. string(const string& str); //使用一个string对象初始化另一个string对象
  4. string(int n, char c); //使用n个字符c初始化

     项目的CMakeLists.txt如下:

#[================================================================[.rst:
    Copyright (c)2021, Tom Zhao personal. ("UsingSTLEx")
    This software is a personal tools project by Tom Zhao.
    Description:
#]================================================================]

set(TZ_MAIN_NAME StringConstructure)

set(TZ_MAIN_INCLUDE

)

set(TZ_MAIN_INC

)

set(TZ_MAIN_SRC
	main.cpp
)

add_executable(${TZ_MAIN_NAME}
	${TZ_MAIN_INCLUDE}
	${TZ_MAIN_INC}
	${TZ_MAIN_SRC}
)

set_property(TARGET ${TZ_MAIN_NAME} PROPERTY FOLDER "UsingString")

     代码示例如下,在提交的项目中是Constructure目录下的项目:


///
// Copyright (c) 2021, Tom Zhao personal. ("UsingSTLEx")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <iostream>
#include <string>

using namespace std;

// string构造函数的使用
void TzStringConstructureCase01()
{
	string s1; // 创建空字符串,调用无参构造函数
	cout << "str1 = " << s1 << endl;

	const char* str = "hello world, I am a C++ student.";
	string s2(str); // 把c_string转换成了string

	cout << "str2 = " << s2 << endl;

	string s3(s2); // 调用拷贝构造函数
	cout << "str3 = " << s3 << endl;

	string s4(10, 'a'); // 利用个数和字符创建重复的str
	cout << "str3 = " << s4 << endl;

	string s5(s4, 3, 5); // 利用其它str的子串创建str
	cout << "str5 = " << s5 << endl;

	string s6(s4, 3); // 利用其它str的子串创建str
	cout << "str6 = " << s6 << endl;

	string s7(s2, 3, 5); // 利用有内容的str的子串创建str
	cout << "str7 = " << s7 << endl;
}

int main(int argc, char *argv[])
{
	TzStringConstructureCase01();

	system("pause");
	return 0;
}

     其运行结果如下图所示, 因此string的构造函数没什么特别的,就正常如同其他函数构造一样使用即可:

3. string赋值操作

     赋值操作主要是给不同的string 对象进行内容的修改的一个基本操作,具体相关的赋值操作的函数原型如下:

  1. string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串
  2. string& operator=(const string &s); //把字符串s赋给当前的字符串
  3. string& operator=(char c); //字符赋值给当前的字符串
  4. string& assign(const char *s); //把字符串s赋给当前的字符串
  5. string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
  6. string& assign(const string &s); //把字符串s赋给当前字符串
  7. string& assign(int n, char c); //用n个字符c赋给当前字符串

     项目的CMakeLists.txt如下:

#[================================================================[.rst:
    Copyright (c)2021, Tom Zhao personal. ("UsingSTLEx")
    This software is a personal tools project by Tom Zhao.
    Description:
#]================================================================]

set(TZ_MAIN_NAME StringOperator)

set(TZ_MAIN_INCLUDE

)

set(TZ_MAIN_INC

)

set(TZ_MAIN_SRC
	main.cpp
)

add_executable(${TZ_MAIN_NAME}
	${TZ_MAIN_INCLUDE}
	${TZ_MAIN_INC}
	${TZ_MAIN_SRC}
)

set_property(TARGET ${TZ_MAIN_NAME} PROPERTY FOLDER "UsingString")

     代码示例如下,在提交的项目中是Operator目录下的项目:


///
// Copyright (c) 2021, Tom Zhao personal. ("UsingSTLEx")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <iostream>
#include <string>

using namespace std;

// string赋值操作的使用
void TzStringOperatorCase01()
{
	string str1;
	str1 = "hello world";
	cout << "str1 = " << str1 << endl;

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

	string str3;
	str3 = 'a';
	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(5, 'x');
	cout << "str7 = " << str7 << endl;
}

int main(int argc, char *argv[])
{
	TzStringOperatorCase01();

	system("pause");
	return 0;
}

     其运行结果如下图所示, 因此string虽然赋值的方式有很多种,但是其实用的最多的还是operator=,因为它比较实用:

4. string的字符串拼接操作

     字符串基本的拼接的操作主要是实现实现在字符串末尾拼接字符串的功能。主要用到的函数原型有下面的一些:

  1. string& operator+=(const char* str); //重载+=操作符
  2. string& operator+=(const char c); //重载+=操作符
  3. string& operator+=(const string& str); //重载+=操作符
  4. string& append(const char *s); //把字符串s连接到当前字符串结尾
  5. string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
  6. string& append(const string &s); //同operator+=(const string& str)
  7. string& append(const string &s, int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾

     项目的CMakeLists.txt如下:

#[================================================================[.rst:
    Copyright (c)2021, Tom Zhao personal. ("UsingSTLEx")
    This software is a personal tools project by Tom Zhao.
    Description:
#]================================================================]

set(TZ_MAIN_NAME StringAppend)

set(TZ_MAIN_INCLUDE

)

set(TZ_MAIN_INC

)

set(TZ_MAIN_SRC
	main.cpp
)

add_executable(${TZ_MAIN_NAME}
	${TZ_MAIN_INCLUDE}
	${TZ_MAIN_INC}
	${TZ_MAIN_SRC}
)

set_property(TARGET ${TZ_MAIN_NAME} PROPERTY FOLDER "UsingString")

     代码示例如下,在提交的项目中是Append目录下的项目:


///
// Copyright (c) 2021, Tom Zhao personal. ("UsingSTLEx")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <iostream>
#include <string>

using namespace std;

// string构造函数的使用
void TzStringConstructureCase01()
{
	string s1; // 创建空字符串,调用无参构造函数
	cout << "str1 = " << s1 << endl;

	const char* str = "hello world, I am a C++ student.";
	string s2(str); // 把c_string转换成了string

	cout << "str2 = " << s2 << endl;

	string s3(s2); // 调用拷贝构造函数
	cout << "str3 = " << s3 << endl;

	string s4(10, 'a'); // 利用个数和字符创建重复的str
	cout << "str3 = " << s4 << endl;

	string s5(s4, 3, 5); // 利用其它str的子串创建str
	cout << "str5 = " << s5 << endl;

	string s6(s4, 3); // 利用其它str的子串创建str
	cout << "str6 = " << s6 << endl;

	string s7(s2, 3, 5); // 利用有内容的str的子串创建str
	cout << "str7 = " << s7 << endl;
}

int main(int argc, char *argv[])
{
	TzStringConstructureCase01();

	system("pause");
	return 0;
}

     其运行结果如下图所示, 因此string 虽然字符串拼接的重载版本很多,初学阶段记住几种即可,能够灵活运用就好:

5. string的查找和替换

     字符串的查找和替换主要是用于查找指定的字符串是否存在且能够替换指定位置的内容。主要用到的函数原型有下面的一些:

  1. int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
  2. int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
  3. int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
  4. int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
  5. int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
  6. int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
  7. int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
  8. int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
  9. string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
  10. string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s

     项目的CMakeLists.txt如下:

#[================================================================[.rst:
    Copyright (c)2021, Tom Zhao personal. ("UsingSTLEx")
    This software is a personal tools project by Tom Zhao.
    Description:
#]================================================================]

set(TZ_MAIN_NAME StringFindAndReplace)

set(TZ_MAIN_INCLUDE

)

set(TZ_MAIN_INC

)

set(TZ_MAIN_SRC
	main.cpp
)

add_executable(${TZ_MAIN_NAME}
	${TZ_MAIN_INCLUDE}
	${TZ_MAIN_INC}
	${TZ_MAIN_SRC}
)

set_property(TARGET ${TZ_MAIN_NAME} PROPERTY FOLDER "UsingString")

     代码示例如下,在提交的项目中是FindAndReplace目录下的项目:


///
// Copyright (c) 2021, Tom Zhao personal. ("UsingSTLEx")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <iostream>
#include <string>

using namespace std;

// string 查找和替换操作的使用
void TzStringFindAndReplaceCase01()
{
	// 查找
	string str1 = "abcdefgde";

	auto pos = str1.find("de");

	if (-1 == pos) 
    {
		cout << "not found" << endl;
	}
    else
    {
		cout << "pos = " << pos << endl;
	}

	pos = str1.rfind("de");

	cout << "pos = " << pos << endl;
}

void TzStringFindAndReplaceCase02()
{
	// 替换
	string str1 = "abcdefgde";
	str1.replace(1, 3, "1111");

	cout << "str1 = " << str1 << endl;

    string str2 = "I am a coder, please remember me!";
    str2.replace(str2.find("coder"), 5, "Coder");
    cout << "str2 = " << str2 << endl;
    str2.replace(str2.find("please"), 5, "Please");
    cout << "str2 = " << str2 << endl;
}

int main(int argc, char *argv[])
{
	TzStringFindAndReplaceCase01();
    TzStringFindAndReplaceCase02();

	system("pause");
	return 0;
}

     其运行结果如下图所示:

     因此string 中查找和替换的使用小结有:

  1. find查找是从左往后,rfind从右往左;
  2. find找到字符串后返回查找的第一个字符位置,找不到返回-1;
  3. replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串;

6. string字符串的比较

     字符串的比较主要是用于比较不同字符串之间的字节流的区别,主要使用的比较方式是字符串比较是按字符的ASCII码进行对比,= 的时候 返回0, > 的时候返回1,< 的时候返回 -1。主要用到的函数原型有下面的一些:

  1. int compare(const string &s) const; //与字符串s比较
  2. int compare(const char *s) const; //与字符串s比较

     项目的CMakeLists.txt如下:

#[================================================================[.rst:
    Copyright (c)2021, Tom Zhao personal. ("UsingSTLEx")
    This software is a personal tools project by Tom Zhao.
    Description:
#]================================================================]

set(TZ_MAIN_NAME StringCompare)

set(TZ_MAIN_INCLUDE

)

set(TZ_MAIN_INC

)

set(TZ_MAIN_SRC
	main.cpp
)

add_executable(${TZ_MAIN_NAME}
	${TZ_MAIN_INCLUDE}
	${TZ_MAIN_INC}
	${TZ_MAIN_SRC}
)

set_property(TARGET ${TZ_MAIN_NAME} PROPERTY FOLDER "UsingString")

     代码示例如下,在提交的项目中是Compare目录下的项目:


///
// Copyright (c) 2021, Tom Zhao personal. ("UsingSTLEx")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <iostream>
#include <string>

using namespace std;

// string Compare操作的使用
void TzStringCompareCase01()
{
	string s1 = "hello";
	string s2 = "aello";

    auto printRet = [](const string& s1, const string& s2, bool ret)
    {
        

以上是关于(C++基础_STL) —— string类的基本应用的主要内容,如果未能解决你的问题,请参考以下文章

(C++基础_STL) —— string类的基本应用

(C++基础_STL) —— string类的基本应用

(C++基础_STL) —— vector 类的基本应用

(C++基础_STL) —— vector 类的基本应用

(C++基础_STL) —— vector 类的基本应用

(C++基础_STL) —— vector 类的基本应用