std::string


title: String
date: 2024-01-10 12:00:00
categories:

  • C++
  • String
    tags: 字符及字符串 #

String

  • string有个接收参数为char指针或者const char指针的构造函数
  • C++中字符串定义,像是const char* name = "String";双引号这种方式的字符串直接为const char*类型,在c++11中规定不允许char*来接受这种形式的字符串,在c++11之前是一种未定义的行为,不好的代码风格
  • C语言风格的字符串数组定义 char name2[7] = { 'S','t','r','i','n','g',0 };需要扩充数组补0来告知编译器结束位置否则编译器会被“烫着”(maybe)

就像

这是因为在这种类型的字符定义不像char *,会有空终止符(the null termination charactor),而是访问到了set cc部分(暂无)

  • 传参时如果直接参数传递会使在heap上动态的分配全新的char数组来存储string的复制内容,slow,所以要用引用传递,eg:void PrintStirng(std::string& string)

常用方法

成员函数说明
append向字符串的末尾添加字符。
assign对字符串的内容赋新的字符值。
at返回对字符串中指定位置的元素的引用。
begin返回发现字符串中第一个元素的位置的迭代器。
c_str将字符串的内容转换为以 null 结尾的 C 样式字符串。
cbegin返回发现字符串中第一个元素的位置的常量迭代器。
cend返回发现字符串中最后一个元素之后的位置的常量迭代器。
clear清除字符串中的全部元素。
compare将字符串与指定字符串比较,确定两个字符串是否相等或按字典顺序一个字符串是否小于另一个。
copy将指定数目的字符从源字符串中的索引位置复制到目标字符组。 已弃用。 请改用 basic_string::_Copy_s
crbegin返回发现反向字符串中第一个元素的位置的常量迭代器。
crend返回发现反向字符串中最后一个元素之后的位置的常量迭代器。
_Copy_sMicrosoft 特定:将指定数目的字符从源字符串中的索引位置复制到目标字符组。
data将字符串的内容转换为字符数组。
empty测试字符串是否包含字符。
end返回发现字符串中最后一个元素之后的位置的迭代器。
ends_withC++20检查字符串是否以指定的后缀结尾。
erase从字符串中的指定位置删除一个或一系列元素。
find向前搜索字符串,搜索与指定字符序列匹配的第一个子字符串。
find_first_not_of在字符串中搜索不属于指定字符串中元素的第一个字符。
find_first_of在字符串中搜索与指定字符串中任何元素匹配的第一个字符。
find_last_not_of在字符串中搜索不属于指定字符串中任何元素的最后一个字符。
find_last_of在字符串中搜索属于指定字符串中一个元素的最后一个字符。
front返回对字符串中第一个元素的引用。
get_allocator返回用于构造字符串的 allocator 对象的副本。
insert将一个、多个或一系列元素插入到指定位置的字符串中。
length返回字符串中元素的当前数目。
max_size返回字符串可包含的字符的最大数目。
rbegin返回指向反向字符串中第一个元素的迭代器。
rend返回指向刚超出反向字符串的最后一个元素的位置的迭代器。
replace用指定字符或者从其他范围、字符串或 C 字符串复制的字符来替代字符串中指定位置的元素。
reserve将字符串的容量设置为一个数目,这个数目至少应与指定数目一样大。
resize根据要求追加或删除元素,为字符串指定新的大小。
rfind向后搜索字符串,搜索与指定字符序列匹配的第一个子字符串。
size返回字符串中元素的当前数目。
starts_withC++20检查字符串是否以指定的前缀开始。
substr从字符串起始处的指定位置复制最多某个数目的字符的子字符串。

全部代码:

#include <iostream>
#include <string> 

void PrintStirng(std::string& string)//直接参数传递会使在heap上动态的分配全新的char数组来存储string的复制内容,slow,所以要用引用传递
{
	std::cout << string << std::endl;
}

int main()
{
	//char* name = "String";//错误,双引号""来包括字符是指的是const char*类型的字符,所以不能用char*来修饰
	
	const char* name = "String";

	//std::string name0="String";
	std::string name0 = std::string("string")+"hello";//显示的调用string构造函数将其一个传入string构造函数中
	bool contains=name0.find("gh")!=std::string::npos;//查找string中是否有想要查找的内容,有1无0(bool),find;
//name0 += "hello";//连接字符串
    //char name2[7] = { 'S','t','r','i','n','g',0 };//需要一个0告知编译器结束位置

	std::cout << name << std::endl;
	std::cout << name0 << std::endl;//<string>中将"<<"重载,使得可以把字符串传入输出流
	std::cout <<contains << std::endl;
	PrintStirng(name0);
	std::cin.get();

}

String literal

string_literals 是一种在计算机编程中用来表示字符串值的字符序列。字符串值是由一个或多个字符组成的文本,比如 “Hello” 或 “你好”。string_literals 通常用双引号 (") 或单引号 (') 包围,具体取决于编程语言的规则。例如,在 Python 中,“Hello” 和 ‘Hello’ 都是 string_literals。在 C++ 中,“Hello” 是一个 string_literal,但 ‘Hello’ 是一个 character_literal,因为它只包含一个字符。

using namespace std::string_literals; 是一种使用命名空间的方法,它可以让你在代码中方便地使用一些用户自定义的字符串字面量 (string literals)。字符串字面量是一种在计算机编程中用来表示字符串值的字符序列,比如 “Hello” 或 “你好”。用户自定义的字符串字面量是一种通过添加一个后缀 (suffix) 来创建字符串对象的方法,比如 "Hello"s 或 "你好"s。这些后缀可以指定字符串的类型和编码,比如 s 表示 std::string 类型,u8 表示 UTF-8 编码,u16 表示 UTF-16 编码,u32 表示 UTF-32 编码,w 表示宽字符类型12

std::string_literals 是 C++ 标准库中的一个内联命名空间 (inline namespace),它包含了四种用户自定义的字符串字面量的运算符 (operator),分别是:

当你在代码中使用 using namespace std::string_literals; 时,你就可以直接使用这些后缀来创建字符串对象,而不需要写出完整的命名空间,比如 std::literals::string_literals::operator""s。这样可以节省一些代码的长度和复杂度,也可以提高代码的可读性和可维护性4

不同的编程语言对 string_literals 有不同的处理方式,比如编码、转义、拼接等。编码是指将字符转换为二进制数的过程,不同的编码方式可能导致不同的结果。转义是指使用特殊的字符序列来表示一些无法直接输入的字符,比如换行符、引号、反斜杠等。拼接是指将多个 string_literals 连接成一个更长的 string_literal 的过程,不同的编程语言可能有不同的语法和规则。

下面是一些关于 string_literals 的例子和解释:

const char* name = "String";//--utf8
const wchar_t* name2 = L"String";//由编译器决定 window-2B linux-4B
const char16_t* name3 = u"String";//2B,每个字符占16bit--utf16
const char32_t* name4 = U"String"; //4B, 每个字符占32bit--utf32

实际操作中会有很多问题,例如:

other thing

  • wstring–宽字符
  • basic_string

basic_string 是 C++ 标准库中的一个字符串类模板,它可以用来存储和操作不同类型的字符序列1。basic_string 的完整语法是:

template <class CharType, class Traits = char_traits<CharType>, class Allocator = allocator<CharType>> class basic_string; 

其中,CharType 参数表示要存储在字符串中的单个字符的数据类型,比如 char, wchar_t, char16_t, char32_t 等。Traits 参数表示字符的各种重要属性,比如比较、复制、转换等。Allocator 参数表示字符串的内存分配器,用于管理字符串的内存分配和释放2

C++ 标准库提供了 basic_string 的四种特化,分别是:

  • string,用于存储 char 类型的字符,相当于 basic_string。
  • wstring,用于存储 wchar_t 类型的字符,相当于 basic_string<wchar_t>。
  • u16string,用于存储 char16_t 类型的字符,相当于 basic_string<char16_t>。
  • u32string,用于存储 char32_t 类型的字符,相当于 basic_string<char32_t>。

basic_string 类提供了许多用于构造、修改、访问、比较、搜索、替换、拼接等字符串操作的函数和运算符,以及一些用于获取字符串的长度、容量、大小、分配器等信息的函数3。basic_string 类还支持一些用户自定义的字面量,用于方便地创建字符串对象4

std::string 本质上是basic_string 的char作为模板参数的模板类实例------- 模板特化(template specialization)

  • 33
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值