做网站属于It行业吗,公司网站建设建设,制作二维码的思维导图,网站建设初期的宣传【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapaci… 【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapacityreserveclearempty Element access元素访问operator[ ]at Modifiers字符串进行修改operatorappendpush_backassigninserterasereplaceswap String operations字符串进行操作c_strcopyfindrfindfind_first_offind_last_offind_first_not_offind_last_not_ofsubstrcompare Member constants成员常量npos Non-member function overloads非成员函数重载operator (string)relational operators (string)swap (string)operator (string)operator (string)getline (string) 链接: string C语言中的字符串
C语言中字符串是以’\0’结尾的一些字符的集合为了方便操作C标准库里面提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太复合OOPOOP即面向对象程序设计全称为Object Oriented Programming的思想而且底层空间需要用户自己管理可能还会又越界访问。
标准库中的string类
1.字符串是表示字符序列的类 2.标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性 3.string类是使用char即作为它的字符类型使用它的char_traits和分配器类型 4.string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数 5.注意这个类独立于所使用的编码来处理字节如果用来处理多字节或变长字符的序列这个类的所有成员如长度或者大小已经它的迭代器将仍然按照字节而不是实际编码的字符来操作 总结 1.string是表示字符串的字符串类 2.该类的接口与常规容器的接口基本相同再添加一些专门用来操作string的常规操作 3.shring再底层实际是basic_string模板类的别名typedef basic_stringchar,char_traits,allocatorstring; 4.不能操作多字节或者变长字符的序列 【注意】在使用string类时必须包含#include头文件以及using namespace std;
string类 string 类
1.strings是代表一系列字符的对象。 2.这个标准字符串类提供支持这样的对象有类似于标准字节容器的接口但是增加了尤其是专门设计去处理单字节字符的字符串的功能 3.这个字符串类是一个标准字符串类的模板的实例使用类似的字符类型char 4.注意此类是独立于之前的编码去处理字节如果去处理多字节或者可变长度字符则此类的所有成员及其迭代器仍然以字节为单位进行操作。
成员变量 string类的常用接口说明
成员函数
string(constructor构造函数) string构造函数初始化字符串对象初始化的值取决于使用的构造函数的版本。
1无参构造函数默认构造函数 default (1) string(); 构造一个空的字符串长度为0的字符 string s1;2拷贝构造函数 copy (2) string (const string str); 构造一个字符串的拷贝 string s2(hello world!);string s3(s2);3substring构造函数 substring (3) string (const string str, size_t pos, size_t len npos); 拷贝部分字符串在pos位置的字符开始len字符数的间隔 string s4(Hello world!, 6, 5);//worstring s5(s3, 0, 1);//w4拷贝字符串的构造函数 from c-string (4) string (const char* s); 拷贝指向c-字符串以null为终止的字符串。 string s6(Hello!);5拷贝部分字符串的构造函数 from sequence (5) string (const char* s, size_t n); 在指向c-字符串的字符串数组中拷贝前n个字符。 string s7(Hello!, 2);//He6填充字符的构造函数 fill (6) string (size_t n, char c); 用字符c的n个连续的字符填充字符串。 string s8(x, 8);//xxxxxxxx~string(destructor析构函数) 字符串析构函数销毁字符串对象
字符串析构函数解除分配字符串分配的所有存储空间。
int main()
{string s1(hello world!);s1.~string();return 0;
}存在默认析构函数所有可以不写。
默认赋值运算符重载函数 string::operator字符串的分配给字符串分配一个新的值取代当前的内容。
1string string operator (const string str); 赋值一个自定义字符串类型 string s1(Hello world!);string s2;s2 s1;2c-string string operator (const char* s); 赋值一个字符串数组 string s3;s3 hello;3character string operator (char c); 赋值一个字符 string s4;s4 h;遍历string
下面介绍三种遍历string字符串的方式。
下标[ ] string::operator[]获取字符串元素返回一个在pos位置处的元素
1 char operator[] (size_t pos); 2const char operator[] (size_t pos) const;
1和2分别使用在自定义函数是否存在const限制防止权限的放大。
遍历string并访问
int main()
{string s1(hello world!);int size s1.size();for (int i 0; i size; i){cout s1[i] ;}return 0;
}遍历string并修改
int main()
{string s1(hello world!);int size s1.size();for (int i 0; i size; i){s1[i];}cout s1 endl;return 0;
}迭代器
在现阶段迭代器的使用可以类似于指针后续在使用迭代器时又可能是指针也又可能不是指针。
在C98中string类中介绍了4种函数。 string::begin将迭代器返回至开始返回迭代器指向的第一个元素的值
1iterator begin(); 2const_iterator begin() const;
防止权限的放大 string::end将迭代器返回至结束将迭代器指向最后一个元素的下一个位置的值即’\0’的值。the past end是一个理论字符它将跟随字符串的最后一个字符它不应该被取消引用。由于被标准库的函数所使用的范围不包括迭代器所指定的元素这个函数经常被使用在与string::begin结合去指定包括字符串所有元素的范围。如果对象是一个空字符串则返回string::begin相同的值
遍历string并打印 string s1(Hello world!);string::iterator it s1.begin();while (it ! s1.end()){cout *it endl;it;}遍历string并修改 string s1(Hello world!);string::iterator it s1.begin();while (it ! s1.end()){(*it);it;}范围for
访问字符串并打印 string s(hello world!);for (char ch : s){cout ch ;}访问字符串并修改 string s(hello world!);for (char ch : s){ch;}【注意】在修改字符串时需要使用引用是因为范围for在读取s字符串时是将s的值赋值给ch。
范围for的底层代替为迭代器下面在汇编角度观察 一个类只要支持迭代器就会支持范围for的用法任何容器都支持迭代器并且用法是类似。
【总结】iterator提供了一种统一的方式访问和修改容器的数据迭代器可以和算法很好地配合算法可以通过迭代器去处理容器中的数据。
反向迭代器
反向迭代器和迭代器刚好相反
rbegin 1reverse_iterator rbegin(); 2const_reverse_iterator rbegin() const; 返回反向迭代器至反向开始返回一个反向迭代器的一个点指向字符串的最后一个元素 rend 1 reverse_iterator rend(); 2const_reverse_iterator rend() const; 返回反向迭代器至反向结束返回一个反向迭代器的一个点指向字符串的第一个元素 使用迭代器同时可以进行字符串的遍历 string s(hello world!);string::reverse_iterator it s.rbegin();//auto it s.rbgein();while (it ! s.rend()){cout *it ;it;}【注意】权限放大与缩小的问题如果需要迭代的字符串是被const修饰的时候需要使用的是const修饰的函数否则会存在权限放大的故障。
capacity
size 返回字符串的长度size_t size() const;
(1)返回字符串的长度以字节为单位。 (2)实际字节的数量遵守字符串内容不一定存储容量相等。 (3)注意字符串在不知道编码的情况下处理字节可能最终被用于编码包含的字符串。因此返回值在多字节或者不同长度的元素顺序中可能与实际编码元素的值不同。 (4)string::size 与 string::length 是同义词返回值相同。 string s(Hello world!);cout s.size() endl;length 返回字符串的长度size_t length() const;
内容与string::size基本相似 string s(hello world!);cout s.length() endl;max_size 返回字符串的最大长度size_t max_size() const;
(1)返回字符串可以读取到的最大长度 (2)字符串可以读取到的最大的可能长度是由于已知系统或者库实现限制决定。但是这个对象不保证可以达到这样的长度它仍然可能无法分配存储在长度无法到达的点上。 string s1;cout s1.max_size() endl;string s2(hello world!);cout s2.max_size() endl;resize void resize (size_t n);void resize (size_t n, char c);调整字符串
(1)将字符串的大小调整为n个字符的长度 (2)当n比当前字符串的长度小当前值缩短至前n个字符删除n个字符以外的字符 (3)当n比当前字符串的长度长通过插入当前内容最后被扩展至n大小的所需要的字符。如果指定c新元素会被初始化为c的副本否则它们是值初始化的字符。 //当n比字符串长度小时string s1(hello world!);s1.resize(5);cout s1 endl;//当n比字符串长度长时string s2(hello world!);s2.resize(15);cout s2 endl;//当n比字符串长度小时string s1(hello world!);s1.resize(5,x);cout s1 endl;//当n比字符串长度长时string s2(hello world!);s2.resize(20,x);cout s2 endl;capacity size_t capacity() const;返回被分配的存储的大小
(1)返回字符串当前分配的存储空间的大小用字节表示 (2)这个容量不同于字符串的长度。可以与之相等或者更长当新的元素增加至字符串中时额外的空间允许对象进行优化操作。 (3)注意这个容量不假设字符串的长度有限制。当空间被用尽或者需要更多时对象会自然地扩展。字符串地理论限制是由成员函数max_size决定。 (4)字符串的容量会在任何时候对象修改的时候修改即使这种修改意味着尺寸的缩小或者容量尚未耗尽。 (5)字符串的容量可以被成员函数reverse明确修改 string s(hello world!);cout s.capacity() endl;【注意】不同的编译器的底层实现不同即容量可能会出现不同。
reserve void reserve (size_t n 0);请求更改容量
(1)请求字符串容量适应一个在长度最多n个字符的计划中的改变 (2)如果n大于当前字符串容量这个函数造成容器将容量增加至n个字符 (3)在其他所有的实例中它被视为收缩字符串容量的收缩性请求容器的实现是自由优化的此外保留字符串的容量大于n (4)这个函数对字符串的长度没有影响并且无法改变其内容。 string s(hello world!);cout s.capacity() endl;s.reserve(20);cout s.capacity() endl;clear void clear();清除字符串
(1)清除字符串的容量将其变成空字符串。 string s(hello world!);s.clear();//遍历打印for (int i 0; i s.size(); i){cout s[i] endl;}empty bool empty() const;判断字符串是否为空
(1)返回字符串是否为空 (2)这个函数没有使用任何方式修改字符串的值。 string s(hello world!);cout s.empty() endl;s.clear();cout s.empty() endl;【注意】 1.size()与length()方法实现底层原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是使用size() 2.clear()只是将string中的有效字符清空不改变底层空间大小 3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变为n个不同的是当字符个数增多时resize(size_t n)会用0来填充多出的元素空间而resize(size_t n, char c)会用字符c来填充多出的元素空间。 4.resize在改变元素个数时如果元素个数增多可能会改变底层容量的大小如果将元素个数减小底层空间总大小不会改变。 5.当reserve();如果里面有数据不会收缩如果被clear();清理后可能会收缩。 6.reserve();只会将capacity();改变而resize();不仅会将改变空间同时会填充值并初始化。
Element access元素访问
operator[ ] 获取字符串的元素。char operator[] (size_t pos);const char operator[] (size_t pos) const;返回一个在pos位置处的元素
at char at (size_t pos);const char at (size_t pos) const;在字符串中获取元素返回一个字符串中pos位置的参考元素。这个函数会自动检查在字符冲中pos位置是否为元素的有效位置如果越界会抛异常 string s1(hello world);s1.at(1) x;cout s1 endl;【注意】使用operator[]与at()基本相同但是需要注意的是如果operator[]越界访问会被断言ar()会出现抛异常。
Modifiers字符串进行修改
operator string (1) string operator (const string str);
一个字符串 string s1(hello);s1 world;cout s1 endl;c-string (2) string operator (const char* s);
一个只读字符 string s1(hello);s1 x;cout s1 endl;character (3) string operator (char c);
一个元素 string s1(hello);char c m;s1 c;cout s1 endl;字符串附加在当前值的末尾通过其他字符扩展字符串
append string (1) string append (const string str);
string附加一个str的副本 string s1(hello);s1.append(world);cout s1 endl;substring (2) string append (const string str, size_t subpos, size_t sublen);
substring附加一个str的子字符串的副本。这个子字符串是str的一部分在元素位置subpos开始间隔sublen个元素个数。 string s1(hello);s1.append(world, 2, 3);cout s1 endl;c-string (3) string append (const char* s);
c-string附加一个由s指向以null结尾字符串序列形成的字符串的副本。 string s1(hello);s1.append(world);cout s1 endl;buffer (4) string append (const char* s, size_t n);
buffer附加一个由s指向元素位置的前n个元素的副本。 string s1(hello);s1.append(world, 3);cout s1 endl;fill (5) string append (size_t n, char c);
fill附加那个连续的字符c的副本 string s1(hello);s1.append(5,x);cout s1 endl;range (6) template class InputIterator string append (InputIterator first, InputIterator last);
initializer list初始值设定项列表按照相同的顺序附加 il 中每一个字符的副本。
push_back void push_back (char c);附加元素到附加元素c到字符串末尾将其长度加一 string s1(hello);s1.push_back(x);cout s1 endl;assign 【注意】分配一个新内容到字符串取代当前内容
string (1) string assign (const string str);
string拷贝字符串 string s1(hello);s1.assign(world);cout s1 endl;substring (2) string assign (const string str, size_t subpos, size_t sublen);
substring拷贝str的一部分在subpos元素位置开始间隔sublen个元素 string s1(hello world);s1.assign(world, 3, 2);cout s1 endl;c-string (3) string assign (const char* s);
c-string拷贝s指向的以null结束的元素列表 string s1(hello);s1.assign(world);cout s1 endl;buffer (4) string assign (const char* s, size_t n);
buffer拷贝s指向的元素数组的前n个元素 string s1(hello);s1.assign(world, 2);cout s1 endl;fill (5) string assign (size_t n, char c);
fill被n个连续的字符c的拷贝代替当前的值 string s1(hello world);s1.assign(5, x);cout s1 endl;range (6) template class InputIterator string assign (InputIterator first, InputIterator last);
range使用相同的顺序在范围内拷贝元素顺序。
insert std::string::insert 【注意】在pos指示的位置之前插入附加的元素到字符串中。
string (1) string insert (size_t pos, const string str);
string插入str的拷贝 string s1(hello);s1.insert(5, world);cout s1 endl;substring (2) string insert (size_t pos, const string str, size_t subpos, size_t sublen);
substring插入str的子字符串的拷贝这个子字符串是str的一部风在subpos元素位置开始间隔sublen个元素 string s1(hello);s1.insert(1, world, 3, 2);cout s1 endl;c-string (3) string insert (size_t pos, const char* s);
c-string插入由s指向以null结束的字符列表形成的字符串的一个拷贝 string s1(hello);s1.insert(5, world);cout s1 endl;buffer (4) string insert (size_t pos, const char* s, size_t n);
buffer插入由s指向数组中的元素的前n个元素的拷贝 string s1(hello);s1.insert(2, world, 3);cout s1 endl;fill (5) string insert (size_t pos, size_t n, char c); void insert (iterator p, size_t n, char c);
fill插入n个连续的字符c的拷贝 string s1(hello);s1.insert(2, 3,x);cout s1 endl;single character (6) iterator insert (iterator p, char c);
single character插入字符c string s1(hello);s1.insert(s1.begin() 1, x);cout s1 endl;range (7) template class InputIterator void insert (iterator p, InputIterator first, InputIterator last);
range使用相同的顺序在范围内拷贝元素顺序
【注意】size_t是无符号整数类型
erase std::string::erase 擦除字符串中的元素 擦除部分字符串缩减其长度 sequence (1) string erase (size_t pos 0, size_t len npos);
sequence擦除字符串的部分值这个值开始于pos位置间隔len长度 string s1(hello);s1.erase(2, 2);cout s1 endl;character (2) iterator erase (iterator p);
character擦除指向p的元素 string s1(hello);s1.erase(s1.begin() 1);cout s1 endl;replace std::string::replace取代部分字符串取代部分字符串开始于pos位置间隔len个元素
swap std::string::swapvoid swap (string str);交换字符串的值
String operations字符串进行操作
c_str std::string::c_strconst char* c_str() const;获取等效的c字符串返回一个指针指向一个包含null结束的字符序列的数组代表当前字符串的值。此数组包含相同的字符序列将string对象的值加上末尾的附加终止null字符‘\0’组成程序不得更改序列中的任何字符返回的指针可能会因进一步调用修改对象的其他成员函数而失效
【注意】c_str();是为了让c的一些接口函数配合 string s1(hello);cout s1.c_str() endl;copy std::string::copysize_t copy (char* s, size_t len, size_t pos 0) const;从字符串中拷贝字符序列
find std::string::find在字符串中查找内容 string ur1 https://editor.csdn.net/md?articleId139749504;size_t pos1 ur1.find(://);string protocal;//协议if (pos1 ! string::npos){protocal ur1.substr(0, pos1);}string domain;//域名string resource;//资源名size_t pos2 ur1.find(/, pos1 3);if (pos2 ! string::npos){domain ur1.substr(pos1 3, pos2 - (pos1 3));resource ur1.substr(pos2 1);//}cout protocal endl;cout domain endl;cout resource endl;rfind std::string::rfind寻找在字符串最后发生的内容寻找由其参数指定的序列的字符串最后发生的内容
find_first_of std::string::find_first_of查找字符串中的元素寻找字符串中的第一个元素匹配其参数中指定的任何字符 string s1(Searches the string for the first character that matches any of the characters specified in its arguments.);size_t found s1.find_first_of(abc);while (found ! string::npos){s1[found] *;found s1.find_first_of(abc, found 1);}cout s1 endl;find_last_of std::string::find_last_of从后面开始在字符串中寻找字符
find_first_not_of std::string::find_first_not_of在字符串中查找缺席的字符
find_last_not_of std::string::find_last_not_of从后面开始查找在字符串中不匹配的字符
substr std::string::substr生成子字符串
compare std::string::compare比较俩个字符串
【注意】 1.在str尾部追加字符时s.push_back©/s.append(1,c)/s x’三种实现方式基本差不多一般情况下string类的操作使用较多不仅可以连接单个字符同时也可以连接字符串。 2.对string进行操作时如果能够预估到多少字符可以使用reserve把空间预留好。
Member constants成员常量
npos std::string::npossize_t的最大值
Non-member function overloads非成员函数重载
operator (string) std::operator (string)连接字符串
relational operators (string) relational operators (string)字符串的关系运算符
swap (string) std::swap (string)交换俩个字符串的值
operator (string) std::operator (string)从流中提取字符串
operator (string) std::operator (string)将字符串插入流中
getline (string) std::getline (string)获取流中的全部字符串