浅谈C++|STL之string篇

在这里插入图片描述

一.string的基本概念

本质

string是C++风格的字符串,而string本质是一个字符串

string和char * 区别

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

特点

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

例如:查找find,拷贝copy,删除delete替换replace,插入insert
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

二.string构造函数

以下是std::string的构造函数原型整理成表格的形式:

构造函数描述
string()默认构造函数
string(const char* s)使用C风格字符串构造函数
string(const char* s, size_t n)使用C风格字符串和长度构造函数
string(size_t n, char c)使用重复字符构造函数
string(const string& str)拷贝构造函数
string(string&& str) noexcept移动构造函数
template string(InputIterator first, InputIterator last)使用迭代器范围构造函数
string(initializer_list ilist)使用初始化列表构造函数
#include <iostream>
#include <string>
using namespace std;
int main() {//默认构造函数string str1;string str2("使用C风格字符串构造函数");string str3("使用C风格字符串和长度构造函数", 5);string str4(10, 'a');string str = "拷贝构造函数";string str5(str);string&& str6 = move("移动构造函数");str = "使用迭代器范围构造函数";string str7(str.begin(), str.end());string str8[2] = { "使用初始化", "列表构造函数" };cout << "wetr";cout << str1 << endl;cout << str2 << endl;cout << str3 << endl;cout << str4 << endl;cout << str5 << endl;cout << str6 << endl;cout << str7 << endl;cout << str8[1]<< str8[2] << endl;return 0;
}

![2023-09-01T01:46:05.png][1]

二.string的赋值操作

以下是std::string的赋值操作函数原型整理成表格的形式:

函数原型描述
string& operator=(const string& str)赋值运算符重载:从另一个字符串赋值
string& operator=(string&& str) noexcept赋值运算符重载:移动赋值
string& operator=(const char* s)赋值运算符重载:从C风格字符串赋值
string& operator=(char c)赋值运算符重载:从单个字符赋值
string& operator=(initializer_list<char> ilist)赋值运算符重载:从初始化列表赋值
string& assign(const string& str)成员函数:从另一个字符串赋值
string& assign(string&& str) noexcept成员函数:移动赋值
string& assign(const char* s)成员函数:从C风格字符串赋值
string& assign(const char* s, size_t n)成员函数:从C风格字符串和长度赋值
string& assign(size_t n, char c)成员函数:使用重复字符赋值
string& assign(initializer_list<char> ilist)成员函数:从初始化列表赋值
string& assign(const_iterator first, const_iterator last)成员函数:使用迭代器范围赋值
#include <iostream>
#include <string>
using namespace std;
int main() {string str1;str1 = "从另一个字符串赋值";cout << str1 << endl;str1 = move("移动赋值");cout << str1 << endl;str1 = "从C风格字符串赋值";cout << str1 << endl;string str = "  使用迭代器范围赋值";str1.assign(str.begin()+2, str.end());cout << str1 << endl;return 0;
}

![2023-09-01T02:02:34.png][2]

三.string拼接操作

以下是std::string的字符串拼接操作函数原型整理成表格的形式:

函数原型描述
string operator+(const string& lhs, const string& rhs)运算符重载:字符串与字符串的拼接
string operator+(const string& lhs, const char* rhs)运算符重载:字符串与C风格字符串的拼接
string operator+(const char* lhs, const string& rhs)运算符重载:C风格字符串与字符串的拼接
string operator+(const string& lhs, char rhs)运算符重载:字符串与单个字符的拼接
string operator+(char lhs, const string& rhs)运算符重载:单个字符与字符串的拼接
string& append(const string& str)成员函数:追加拼接另一个字符串
string& append(const string& str, size_t subpos, size_t sublen)成员函数:从另一个字符串的指定位置截取指定长度后进行拼接
string& append(const char* s)成员函数:追加拼接C风格字符串
string& append(const char* s, size_t n)成员函数:追加拼接C风格字符串的指定长度
string& append(size_t n, char c)成员函数:追加拼接指定数量的重复字符
string& append(initializer_list<char> ilist)成员函数:追加拼接初始化列表中的字符
#include <iostream>
#include <string>
using namespace std;
int main() {string str;string str1 = "01234567";str += "hello";str += string("word");str += (string("  word") + "20  ");str.append(str1, 5, 2);cout << str;return 0;
}

四.string的查找和替换

下面是关于std::string查找和替换的常用函数原型:

查找相关函数:

函数原型描述
size_t find(const string& str, size_t pos = 0) const noexcept;在字符串中查找另一个字符串的位置
size_t find(const char* s, size_t pos = 0) const;在字符串中查找C风格字符串的位置
size_t find(char c, size_t pos = 0) const noexcept;在字符串中查找字符的位置
size_t rfind(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找另一个字符串的位置
size_t rfind(const char* s, size_t pos = npos) const;在字符串中从后往前查找C风格字符串的位置
size_t rfind(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找字符的位置
size_t find_first_of(const string& str, size_t pos = 0) const noexcept;在字符串中查找第一个匹配另一个字符串中任意字符的位置
size_t find_first_of(const char* s, size_t pos = 0) const;在字符串中查找第一个匹配C风格字符串中任意字符的位置
size_t find_first_of(char c, size_t pos = 0) const noexcept;在字符串中查找第一个匹配字符的位置
size_t find_last_of(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个匹配另一个字符串中任意字符的位置
size_t find_last_of(const char* s, size_t pos = npos) const;在字符串中从后往前查找第一个匹配C风格字符串中任意字符的位置
size_t find_last_of(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个匹配字符的位置
size_t find_first_not_of(const string& str, size_t pos = 0) const noexcept;在字符串中查找第一个不匹配另一个字符串中任意字符的位置
size_t find_first_not_of(const char* s, size_t pos = 0) const;在字符串中查找第一个不匹配C风格字符串中任意字符的位置
size_t find_first_not_of(char c, size_t pos = 0) const noexcept;在字符串中查找第一个不匹配字符的位置
size_t find_last_not_of(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个不匹配另一个字符串中任意字符的位置
size_t find_last_not_of(const char* s, size_t pos = npos) const;在字符串中从后往前查找第一个不匹配C风格字符串中任意字符的位置
size_t find_last_not_of(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个不匹配字符的位置

替换相关函数:

函数原型描述
string& replace(size_t pos, size_t len, const string& str);替换指定位置和长度的子字符串为另一个字符串
string& replace(size_t pos, size_t len, const char* s);替换指定位置和长度的子字符串为C风格字符串
string& replace(size_t pos, size_t len, const char* s, size_t n);替换指定位置和长度的子字符串为C风格字符串的指定长度
string& replace(size_t pos, size_t len, size_t n, char c);替换指定位置和长度的子字符串为指定数量的重复字符
string& replace(iterator first, iterator last, const string& str);替换迭代器范围内的子字符串为另一个字符串
string& replace(iterator first, iterator last, const char* s);替换迭代器范围内的子字符串为C风格字符串
string& replace(iterator first, iterator last, const char* s, size_t n);替换迭代器范围内的子字符串为C风格字符串的指定长度
string& replace(iterator first, iterator last, size_t n, char c);替换迭代器范围内的子字符串为指定数量的重复字符
#include <iostream>
#include <string>
using namespace std;
int main() {string str = "1234578912345789";int a = str.find("78");cout << a << endl;a = str.rfind("78");cout << a << endl;//从下标1开始的三个字符替换成abcdstr.replace(1, 3, "abcd");cout << str << endl;return 0;
}

![2023-09-01T02:19:00.png][3]

五.string的字符串比较

下面是关于std::string比较的常用函数原型:

函数原型描述
int compare(const string& str) const noexcept;比较字符串和另一个字符串
int compare(size_t pos, size_t len, const string& str) const;比较字符串的子串和另一个字符串
int compare(const char* s) const;比较字符串和C风格字符串
int compare(size_t pos, size_t len, const char* s) const;比较字符串的子串和C风格字符串
int compare(size_t pos, size_t len, const char* s, size_t n) const;比较字符串的子串和指定长度的C风格字符串

上述函数通过返回整数值来表示比较的结果,其返回值的含义如下:

  • 返回值 < 0 表示当前字符串小于目标字符串。

  • 返回值 > 0 表示当前字符串大于目标字符串。

  • 返回值 = 0 表示当前字符串等于目标字符串。

    #include
    #include
    using namespace std;
    int main() {
    string str = “1234578912345789”;
    //从0下标开始的6个字符的子串,后一个的字串比较
    int m=str.compare(0,6, “12345789”, 6);
    cout << m << endl;
    return 0;
    }

六.string字符串存取

下面是关于std::string字符串存取的常用函数原型:

函数原型描述
char& operator[](size_t pos);访问字符串中指定位置的字符
const char& operator[](size_t pos) const;访问字符串中指定位置的字符(const版本)
char& at(size_t pos);访问字符串中指定位置的字符,带范围检查
const char& at(size_t pos) const;访问字符串中指定位置的字符,带范围检查(const版本)
char& front();访问字符串的第一个字符
const char& front() const;访问字符串的第一个字符(const版本)
char& back();访问字符串的最后一个字符
const char& back() const;访问字符串的最后一个字符(const版本)
const char* data() const noexcept;返回字符串数据的指针
const char* c_str() const noexcept;返回以空字符结尾的字符串的指针(C风格字符串)
const char* data() const noexcept;返回字符串数据的指针
const char* c_str() const noexcept;返回以空字符结尾的字符串的指针(C风格字符串)

这些函数允许您对std::string对象进行字符的存取操作,可以直接访问特定位置的字符,或者获取字符串的首尾字符。data()c_str()函数还可以返回字符串数据的指针(以及以空字符结尾的C风格字符串的指针),方便与C语言接口进行交互操作。请注意,在只读的场景下使用at()函数可以提供范围检查,避免越界访问。

七.string的插入和删除

下面是关于std::string插入和删除字符串的常用函数原型:

函数原型描述
string& insert(size_t pos, const string& str);在指定位置插入另一个字符串
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);在指定位置插入另一个字符串的子串
string& insert(size_t pos, const char* s);在指定位置插入C风格字符串
string& insert(size_t pos, const char* s, size_t n);在指定位置插入指定长度的C风格字符串
string& insert(size_t pos, size_t n, char c);在指定位置插入指定数量的字符
iterator insert(iterator p, char c);在指定位置插入单个字符
iterator insert(iterator p, size_t n, char c);在指定位置插入指定数量的字符
iterator insert(iterator p, InputIt first, InputIt last);在指定位置插入迭代器范围的字符
template <class InputIt> void insert(iterator p, InputIt first, InputIt last);在指定位置插入迭代器范围的字符
template <class InputIt> void insert(iterator p, initializer_list<typename InputIt::value_type> ilist);在指定位置插入初始化列表的字符
string& erase(size_t pos = 0, size_t len = npos);删除字符串的子串
iterator erase(iterator p);删除指定位置的字符
iterator erase(iterator first, iterator last);删除迭代器范围内的字符

这些插入和删除函数允许您在std::string对象中插入或删除字符串内容。通过这些函数,您可以在指定位置插入字符串、字符或字符范围,也可以删除字符串子串、指定位置的字符或一段字符范围。这些函数提供了灵活的方式来操作字符串,满足不同场景下的需求。

八.获得string的子串

以下是使用substr函数获取字符串子串的表格总结:

函数原型描述
string substr(size_t pos = 0, size_t len = npos) const;获取从指定位置开始的一段子串

示例:

std::string str = "Hello, World!";
std::string sub1 = str.substr(7);        // "World!"
std::string sub2 = str.substr(0, 5);     // "Hello"
std::string sub3 = str.substr(7, 5);     // "World"

使用substr函数,您可以方便地获得std::string的子串,通过指定起始位置和长度参数来进行操作。

九.函数接口

序号函数接口功能描述
1push_back©在字符串的末尾添加字符 c
2pop_back()删除字符串的最后一个字符
3resize(n)调整字符串的大小为 n
4resize(n, c)调整字符串的大小为 n,并将新增的元素初始化为字符 c
5front()返回字符串的第一个字符
6back()返回字符串的最后一个字符
7find_first_of(str)在字符串中查找字符串 str 中的任意字符第一次出现的位置
8find_first_not_of(str)在字符串中查找字符串 str 中的任意字符第一次不出现的位置
9find_last_of(str)在字符串中从后往前查找字符串 str 中的任意字符最后一次出现的位置
10find_last_not_of(str)在字符串中从后往前查找字符串 str 中的任意字符最后一次不出现的位置
11toLowerCase()将字符串中的字母全部转换为小写
12toUpperCase()将字符串中的字母全部转换为大写
13at(n)返回字符串中索引为 n 的字符
14operator[] (n)返回字符串中索引为 n 的字符
15substr(pos)返回从位置 pos 开始到字符串末尾的子字符串
16compare(pos, len, str)将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 比较
17getline(input_stream, str, delimiter)从输入流 input_stream 中读取一行文本,并将结果存储到字符串 str 中
18stoi(str)将字符串 str 转换为整数值
19stol(str)将字符串 str 转换为长整数值
20stof(str)将字符串 str 转换为浮点数值
21to_string(value)将值 value 转换为字符串
22find_last_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 第一次出现的位置
23find_last_not_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 第一次不出现的位置
24replace(pos, len, newstr, newlen)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串
25find_first_of(str, pos)在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次出现的位置
26find_first_not_of(str, pos)在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次不出现的位置
27compare(pos, len, str, subpos, sublen)将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 中从位置 subpos 开始的长度为 sublen 的子字符串进行比较
28replace(pos, len, str)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为字符串 str
29capacity()返回字符串当前能够容纳的字符数
30reserve(n)将字符串的容量设置为至少为 n 个字符
31shrink_to_fit()将字符串的容量调整为与字符串的长度相匹配,以节省内存空间
32find_last_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次出现的位置
33find_last_not_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次不出现的位置
34replace(pos, len, newstr)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串
35replace(iterator1, iterator2, newstr)将迭代器 iterator1 和 iterator2 之间的子字符串替换为新的字符串
36copy(char_array, len, pos)将字符串中从位置 pos 开始的长度为 len 的子字符串复制到字符数组 char_array 中
37find_if(predicate)在字符串中查找满足谓词函数 predicate 的第一个字符的位置
38rfind(str)在字符串中从后往前查找子字符串 str 并返回第一次出现的位置
39rfind(str, pos)在字符串中从位置 pos 开始从后往前查找子字符串 str 并返回第一次出现的位置
40replace_if(predicate, newstr)将字符串中满足谓词函数 predicate 的字符替换为新的字符串

请注意,这里的表格仅提供了功能描述的简要介绍,具体的函数行为和参数要求请查阅官方文档以获取详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造基于终端命令行的IDE,Termux配置Vim C++开发环境

Termux配置Vim C开发环境&#xff0c;打造基于终端命令行的IDE 主要利用VimCoc插件&#xff0c;配置C的代码提示等功能。 Termux换源 打开termux&#xff0c;输入termux-change-repo 找到mirrors.tuna.tsinghua.edu.cn&#xff0c;清华源&#xff0c;空格选中&#xff0c;回…

MySQL间隙锁深入分析

概念 什么是间隙锁&#xff1f; MySQL的间隙锁&#xff08;gap lock&#xff09;是一种锁定相邻数据间隔的机制。 触发时机&#xff1f; 当使用SELECT…FOR UPDATE或UPDATE语句时&#xff0c;MySQL会获取一个范围锁&#xff0c;包括指定条件内的所有数据行&#xff0c;并且还…

【算法系列 | 8】深入解析查找算法之—二分查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第8讲&#xff0c;讲一…

UPS电源UL1778认证,不间断电源系统ul1778认证

UPS电源UL1778认证&#xff0c;不间断电源系统ul1778认证 UL认证-不间断电源系统ul1778认证范围&#xff1a; 不间断电源系统&#xff1a;UPS即不间断电源(Uninterruptible Power Supply)&#xff0c;是一种含有储能装置的不间断电源。主要用于给部分对电源稳定性要求较高的设…

C++ std::future

std::future是用来接收一个线程的执行结果的&#xff0c;并且是一次性的。 共享状态shared state future可以关联一个共享状态&#xff0c;共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的&#xff0c;且这个结果只能设置一次。 创建future …

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改&#xff0c;正常运行--在keil arm5内

pta java版

7-1 厘米换算英尺英寸 如果已知英制长度的英尺foot和英寸inch的值&#xff0c;那么对应的米是(footinch/12)0.3048。现在&#xff0c;如果用户输入的是厘米数&#xff0c;那么对应英制长度的英尺和英寸是多少呢&#xff1f;别忘了1英尺等于12英寸。 思路&#xff1a; 1英尺12英…

每日一题 2596. 检查骑士巡视方案

难度&#xff1a;中等 很简单&#xff0c;从第 0 步开始模拟即可&#xff0c;唯一sb的就是测试用例中如果&#xff08;0&#xff0c;0&#xff09;处不为0的话就直接false&#xff0c;而不是去找0在哪 我的代码&#xff1a; class Solution:def checkValidGrid(self, grid: L…

Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

文章目录 参考博客&#xff1a; Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件&#xff0c;1037.err和1037.out。 1037.err的文件内容如下&#xff1a; /data/home/user12/.lsbat…

RobotFrameWork自动化测试环境搭建

前言 Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发&#xff08;ATDD&#xff0…

Redis-带你深入学习数据类型zset

目录 1、zset有序集合 2、zset相关命令 2.1、添加或更新指定的元素——zadd 2.2、获取有序集合zset的元素个数相关命令&#xff1a;zcard、zcount 2.3、返回指定区间元素相关命令&#xff1a;zrange、arevrange、zrangebyscore 2.4、删除相关命令&#xff1a;zpopmax、zp…

最优化:建模、算法与理论(优化建模——2)

3.10 K-均值聚类 聚类分析是 统计学中的一个基本问题&#xff0c;其在机器学习&#xff0c;数据挖掘&#xff0c;模式识别和图像分析中有着重要应用。聚类不同于分类&#xff0c;在聚类问题中我们仅仅知道数据点本身&#xff0c;而不知道每个数据点具体的标签。聚类分析的任务…

理财是什么?怎样学习理财?

大家好&#xff0c;我是财富智星&#xff0c;今天跟大家分享一下理财是什么&#xff1f;怎样学习理财的方法。 一、理财的基本原则 1、理财应注重投资而不是投机&#xff0c;要与时间为友。 让我们先考虑以下问题&#xff1a;什么样的回报才算是真正的高回报&#xff1f;假设有…

TypeScript命名空间和模块

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 命名空间&#xff08;Namespace&#xff09; 命名空间&#xff08;Namespace&#xff09;使用场景 第三方库 兼容…

linux rz乱码文件删除

通过rz上传文件的时候经常会遇到 文件乱码问题&#xff0c;删又删不掉。 使用rz -be的方法上传 遇到乱码文件操作步骤 1. ls -i # 列出文件的编号 2. find . -inum 29229139 -delete # 根据编号删除文件 find 需要扫描的路径 -inum 文件编号 -delete

Vue.js not detected解决方法

扩展程序》管理扩展程序》详情》允许访问文件地址打开

软件测试7大误区

随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…

Vulnhub系列靶机---HarryPotter-Fawkes-哈利波特系列靶机-3

文章目录 信息收集主机发现端口扫描dirsearch扫描gobuster扫描 漏洞利用缓冲区溢出edb-debugger工具msf-pattern工具 docker容器内提权tcpdump流量分析容器外- sudo漏洞提权 靶机文档&#xff1a;HarryPotter: Fawkes 下载地址&#xff1a;Download (Mirror) 难易程度&#xff…

C++面试/笔试准备,资料汇总

文章目录 后端太卷&#xff0c;建议往嵌入式&#xff0c;qt&#xff0c;测试&#xff0c;音视频&#xff0c;C一些细分领域投简历。有任何疑问评论区聊&#xff0c;我看到了回复 C面试/笔试准备&#xff0c;资料汇总自我介绍项目实习尽可能有1.编程语言&#xff1a;一.熟悉C语言…

【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…