目录
1.constructor、destructor、operator
6.3 find/rfind/find_first_of/find_last_of(npos,是成员常量)
二、Non-member function overloads(非成员函数重载)
目录里面黄色参数类似,画横线是常用函数
一、Member functions(成员函数)
1.constructor、destructor、operator
1.1 constructor(构造函数)
1.1.1 default(默认构造)
#include<iostream>
using namespace std;
void test1() {
string s1();
}
int main() {
test1();
return 0;
}
1.1.2 copy(构造拷贝)
1.1.3 substring(子字符串构造)
复制str中从字符位置pos开始并跨越len字符的部分(或者,如果str太短或len是string::npos,则复制到str的末尾)。
1.1.4 from c-string
(满足c语言指针的使用)
复制s指向的以空结尾的字符序列(C-string)。
1.1.5 from sequence
从s指向的字符数组中复制前n个字符。
1.1.6 fill (填充构造)
用字符c的n个连续副本填充字符串。
1.1.7 range(范围构造)
以相同的顺序复制范围[first,last)中的字符序列。注意前闭后开
1.2 destructor(析构函数)
这个解除所有被字符串使用它的分配器(allocator)分配到的储存空间
1.3 operator=
分配一个新值给string,代替他现在的内容
2. iterators(迭代器)
2.1 begin、end
返回一个迭代器指向string的首字母。
返回一个迭代器指向string的末尾字符(最后一个字符的后面)
末尾字符是一个理论字符,它在string的最后一个字符的后面。它不应被间接使用.
因为被标准库的函数使用的范围(ranges)不包括被闭合的迭代器指向的元素(一般是左闭右开区间),这个函数经常被和string::begin一起结合使用,去用来指定string里面包含的所有字符串的范围。
如果使用对象是一个空字符,这个函数的返回值和string::begin一样
2.2 rbegin、rend
返回一个反向迭代器指向的string的最后一个字符。
反向迭代器向后迭代:增加他们将会使它们向string的开头移动。
rbegin指向的字符恰好在成员end指向的前面。
返回一个反向迭代器指向的string第一个字符前面的理论上的元素(这个元素也被称为它的反向的end)
引用一张图能很好的解释2.2与2.1的关系
2.3 cbegin、cend;crbegin、crend
使用const_iterator/const_reverse_iterator不能改变它们指向的内容,其他相应功能与2.1、2.2一样
3. capacity(容量)
3.1 size/length
以字节为单位返回string的长度。
这是符合string内容的实际字节值,它是不必要与string的储存容量相等。
请注意string对象在不知道会被编码的情况下计算字节值,其中这个编码最终可能会改变string包含的内容。因此返回的值可能不会和被编码包含多字节或可变长度字符的序列(如UTF-8)字符的实际数量一致
(这意味着,当字符串对象需要处理包含多字节或可变长度字符(如UTF-8)的序列时,返回的字符串长度可能是以字节为单位计算的,而不是实际编码字符的数量。这种处理方式强调了字符编码的重要性,因为不同的编码方式可能会导致字符串长度和内容的不同解读。例如,UTF-8编码可以表示任何Unicode字符,但每个字符可能由1到4个字节组成,这取决于字符的复杂性。因此,当处理字符串时,了解并正确应用适当的字符编码是至关重要的,以确保数据的正确解析和显示)
string::size和string::length是同义词并且返回相同的值
3.2 resize//可以放大缩小
重新调整string的长度为n个字符。
如果n比现在的字符串长度小,现在的字符会被缩短到第n个字符,去掉第n个字符后面的字符。
如果n比现在的字符串长度大,通过在字符串末尾插入要达到长度为n所需的字符来扩大现在的内容。如果c(插入的字符)被规定了,那么被插入的新的元素被初始化为c的拷贝,否则它们是值初始化字符(空字符)
3.3 capacity
返回现在被分配给string的存储空间的大小,以字节为单位表示。
。。。
请注意这个容量并不限制string的长度。当容量被耗尽,更多的容量被需要时,它会被对象自动扩展(重新分配它的存储空间)。string长度的理论限制值被成员函数max_size给出。
当对象被修改时string的容量可以被任意修改,即使这种修改意味着大小的减小或者容量还没有被耗尽(这个与vactor容量的保证相反)
一个string的容量可以通过使用成员函数reserve来显式的改变。
3.4 reserve/shrink_to_fit//只能缩小
请求string容量去适应计划改变大小,最大为n个字符。
如果n大于现在的字符容量,这个函数会导致容器增长它的容量到n个字符(或者更大)。
在所有的情况里面,它会被当成一个不具约束力的请求去缩小string的容量:容器自由执行其他优化,并且使string的容量比n更大。
这个函数对string的大小没有影响,并且不能改变它的内容。
只能缩小,其它规则与reserve一样
3.5 clear
清除string的内容,这个string会变成一个空的string(长度为0个字符串)
3.6 empty
返回string是否为空(长度是否为0)
4.element access(元素访问)
4.1 operator[]
返回string下标为pos位置字符的引用。
如果pos等于string的长度并且string是const限制的,这个函数就返回空字符的引用(‘\0')
string没有被const修饰时,可以通过此函数引用下标为length的字符并改变,但是在监视窗口里面不能使用来查找。此举动不会改变string的大小(size),故打印还是会打印出原长度的string。不做改变时返回的是空字符。
4.2 at
返回string下标为pos的字符的引用。
这个函数会自动检查pos是否是string的字符的合理位置(pos是否小于string的长度),如果它不是就返回一个out_of_range异常。
4.3 back/front
返回string的最后一个字符的引用
这个函数不能被空字符串使用
不像成员函数string::begin,返回一个指向同一字符的迭代器,这个函数返回一个直接的引用
其他的跟back一样
5.modifers(修改器)
5.1operator+=
通过在string当前值的末尾增添额外的值来扩增string
5.2 append
参数类型和string构造函数分类类似,统一记忆
5.3 push_back
只能在末尾加一个字符c
5.4 assgin//替换整个
分配一个新值给string,代替它现在的内容。
参数内容跟append类似。
5.5 insert
在string下标为pos的字符前面插入增加的字符。
大部分参数内容和前面类似,但是加了一个pos在前面。
需要额外记忆的有如下函数
被指向插入点的迭代器:新的内容会被插入在p指向的字符的前面。
迭代器是一个成员类型,被定义为指向string字符的随机访问迭代器类型。
可见两个函数返回的迭代器指向被插入的字符
5.6 erase
删除被p指向的字符
返回的迭代器指向最后被删除的字符的后一位
5.7 replace//替换一部分
看起来参数很复杂,实际上是在常使用的参数类型前面加上pos、len,或者i1、i2
用新的内容代替string下标为pos,长度为len处的字符(或者是string在范围[i1,i2)的部分)
5.8 swap
用str的内容替换容器的内容,另一个string对象的长度可能不同。
在使用这个成员函数之后,这个对象的值变成了这个之前使用函数的str的值,这个str的值变成了这个之前使用函数的对象的值。总的来说就是调用函数的对象和str的值内容交换。
请注意非成员同名函数存在时,swap,用和这个成员函数一样行为的优化来重载算法。
5.9 pop_back
清除string的最后一个字符,很有效率地将它的长度减一。
6. string operators(string操作)
6.1 c_str/data
返回一个指向数组的指针,这个数组包含以null结尾的字符序列(也就是c_str),代表着string对象现在的值
。。。后面讲的都是一个意思。
和string::data同义,返回一样的值。
如果以后再使用成员函数修改现在的对象,这个指针返回的值可能会无效。因为现在可能指向一个已经被对象内部重新分配的内存区域所覆盖的旧位置。
c_str()
返回的指针仅在std::string
对象的内容没有改变的情况下才保持有效。一旦std::string
对象的内容发生变化(包括大小的变化),就应该重新获取c_str()
返回的指针。
6.2 copy
将string对象的当前值的子字符串到被s指的数组,这个子字符串包括在下标为pos开始的len个长度的字符。
这个函数不在复制内容后面加null字符。
注意返回值为size_t, len与pos和常规成员函数参数顺序不一样。不在复制内容后加null。
6.3 find/rfind/find_first_of/find_last_of(npos,是成员常量)
搜索string中和参数指定匹配的第序列一个出现的位置。
当pos被指明时,这个搜索只包含pos及其以后的字符,忽视pos前面任何其他可能出现的字符。
请注意不像成员函数find_first_of,无论何时当搜索第一个字符更多时,只有一个字符匹配是不够的,一定要整个序列都匹配。
如果没有找到就返回string::npos
npos是一个静态成员常量值,是size_t类型元素最大可能的值。
这个值在string成员函数里面被使用为len(或者sublen)参数时,意味着"直到string的结尾“。
作为一个返回值,它通常表明没有匹配上。
这个常数被定义为-1,这是因为size_t是一个无符号整型,它是对于这个类型可以表示的最大可能的值。
反方向向前寻找
寻找string中第一个与这个函数里面参数匹配的字符。
寻找与参数包含的任意字符匹配的最后一个字符
6.4 substr
返回一个重新构造的string对象,它的值被这个使用函数的对象的子字符串的拷贝给初始化了。
这个子字符串是对象中下标为pos的字符开始,长度为len的部分。(或者直接到string的结尾,以先到的为准)。
6.5 compare
比较对象string的值(或者一个子字符串)和被函数的参数指定的一系列字符。
被比较的string是string对象的值,-或者是被使用的函数的参数pos和len-,这个子字符串由下标为pos的字符开始,跨越len长度的字符。
这个string是与被函数传来的其他参数指定的comparing string比较。
说了这么多,这个pos和len是修饰使用这个成员函数的string的
二、Non-member function overloads(非成员函数重载)
2.1 +/relational operators
参数内容截取不完全,就是函数重载任意参数都可以被const修饰
没有了和char类型的比较
2.2 swap(非成员函数重载)
其实功能和成员函数swap一样,就不作仔细翻译了,但是它底层的实现不一样。
这是一个通用算法swap的重载,它通过和其他对象互换它们内部数据的所有权来优化性能(也就是string交换它们数据的引用,没有实际拷贝字符)它和x.swap(y)的行为一样。
如果是像树等这样的结构,优化效果更明显。
使用的区别:成员函数swap能够直接访问对象的私有和保护成员,
非成员函数重载性能更优化。
2.3 >>/<<
从输入流is中提取string,用str储存到序列,这个序列会被覆盖(在str之前的值会被替换)。
这个函数重载operate>>,表现得像c-strings里面的istream::operator描述的一样,但是被stirng对象使用。
每一个额外的字符加入到string就像它的成员函数push_back被使用时一样。
请注意这个istream的提取操作使用空格作为分割符;因此,这个操作只会提取流中被看作是单词的东西。要想提取文本的整行,需要看string的重载全局函数getline。
2.4 getline
从is中提取字符并将其存储到str中,直到找到分隔符delim(或换行符'\n',用于(2))。
如果在is中到达文件末尾,或者在输入操作过程中发生其他错误,提取也会停止。
如果找到分隔符,则提取并丢弃它(即不存储它,下一个输入操作将在它之后开始)。
请注意,调用前str中的任何内容都将被新提取的序列替换。每个提取的字符都被附加到字符串中,就像其成员push_back被调用一样。
注意要包含<string>头文件,因为 std::getline
函数是在这个头文件中声明的。如果忘记包含这个头文件,编译器就找不到 std::getline
。