莱芜市住房和城乡建设厅网站,推动高质量发展的必然要求,无锡商业网站建设,wordpress改成英文本文介绍的是C关键字string中一些重要用法#xff0c;以及各种字符串序列的处理操作 ——飘飘何所似#xff0c;天地一沙鸥 文章目录前言一、string#xff08;字符串类#xff09;二、string类对象的容量操作2.1 size/length2.2 capacity2.3 empty/clear2.4 resize/reser… 本文介绍的是C关键字string中一些重要用法以及各种字符串序列的处理操作 ——飘飘何所似天地一沙鸥 文章目录前言一、string字符串类二、string类对象的容量操作2.1 size/length2.2 capacity2.3 empty/clear2.4 resize/reserve三、string类对象的访问及便利操作3.1 operator[]3.2 beginend迭代器3.3 范围for四、string类对象的修改操作4.1 operator/push_back/append4.2 c_str4.3 find/rfind4.4 substr前言
string是C、java、VB等编程语言中的字符串字符串是一个特殊的对象属于引用类型。 在java、C#中String类对象创建后字符串一旦初始化就不能更改因为string类中所有字符串都是常量数据是无法更改由于string对象的不可变所以可以共享。对String类的任何改变都是返回一个新的String类对象。 C标准库中string类以类型的形式对字符串进行封装且包含了字符序列的处理操作。 一、string字符串类
字符串是表示字符序列的类。标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型使用它的默认char_traits和分配器类型(关于模板的更多信息请参阅basic_string)。string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作。
总结
string是表示字符串的字符串类。该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。string在底层实际是basic_string模板类的别名typedefbasic_stringchar,char_traits,allocator string;不能操作多字节或者变长字符的序列。在使用string类时必须包含#include头文件以及using namespace std;
二、string类对象的容量操作
2.1 size/length
size_t size() const; 计算字符串长度类接口
#includeiostreamusing namespace std;int main()
{//创建string类型的字符串strstring str (hello C);//计算str大小std::cout The size of str is str.size() bytes.\n;return 0;
}length与size并没有什么区别仅仅只是在STL没有出现时length就已经存在了而我们也知道语言的发展一定是向下兼容的它不会去删除原有的东西只会出现更多的补丁和更加新鲜的东西
#includeiostreamusing namespace std;int main()
{string str (hello C);std::cout The size of str is str.size() bytes.\n;std::cout The size of str is str.length() bytes.\n;return 0;
}2.2 capacity
size_t capacity() const; 计算string类空间大小
#includeiostreamusing namespace std;int main()
{string str (hello C);std::cout The size of str is str.size() bytes.\n;std::cout str.capacity() endl;return 0;
}2.3 empty/clear
bool empty() const; 检出字符串释放为空串是则返回ture否返回false void clear(); 清空字符串但是不会删除该字符串空间 仅仅只是一个判断string类字符串是否已经置为空。 S1中内容已经被删空但是我们看到S1所在空间并没有被释放还是在原来的地址并且可以访问到存入新的东西。
2.4 resize/reserve
void resize (size_t n); void resize (size_t n, char c); 将有效字符改为n并将多余的空间用c填充
void reserve (size_t n 0); 为字符串预留空间
先将s的内容改为和s1一致然后对他们分别使用resize/reserve进行扩容最后分别输出他们的内容和他们所扩容空间的大小。
resize/reserve根本的区别就在于一个对它所开的空间进行初始化而另一个并不会对开的空间进行初始化还有一点就是当所开空间小于原有空间时他会保留前面n个数据,然年舍弃多余的部分 另外在进行空间开辟工作时候最后事先知道空间用量进行提前预留使用reserve会极大的提高时间复杂度
三、string类对象的访问及便利操作
3.1 operator[]
char operator[] (size_t pos); const char operator[] (size_t pos) const; 返回pos位置的字符const string类对象调用 不做过多介绍类似于数组的方式来直接获取第pos个数据
3.2 beginend迭代器
iterator begin(); const_iterator begin() const; 迭代器是string中便利字符串的一种重要工具具体实现如下
3.3 范围for
范围for的底层实现就是调用迭代器在使用的时候借用了关键字auto可以不用定义冗余的类型算是一种很方便的用法不过多介绍代码如下
for(auto ch:s)
{
coutch ;
ch;
}
coutendl;四、string类对象的修改操作
4.1 operator/push_back/append
string operator (const string str); string operator (const char s); string operator (char c)* 最便捷的一种追加方式直接在原字符串上进行可以追加string类/字符串/字符直接 void push_back (char c); 尾插字符c,就是顺序表/链表的那种尾插方式遍历尾插不建议用效率很低 operator可以随意的进行字符/字符串/类的追加
append是坑不作介绍不建议用
4.2 c_str
const char c_str() const;* c_str()是Borland封装的String类中的一个函数它返回当前字符串的首字符地址。 换种说法c_str ()函数返回一个指向正规C字符串的 指针常量 内容与本string串相同。
c_str()返回的是一个临时指针随着原指针指向位置数值的改变
这样看来c_str好像没有实际的意义与用途其实s_str多用于与其他各种操作一起进行我们只需要了解他的用法就可以一般不会单独使用来实现什么东西。在进行c_str的使用时尽量在每次都strcpy一下防止丢失。
int main() {char ptr[5];string s 12345;strcpy(ptr, s.c_str());cout s改变前ptr为 ptr endl;s 66666;cout s改变后ptr为 ptr endl;return 0;//结果 ptr”12345“
} 4.3 find/rfind
size_t find (const string str, size_t pos 0) const; size_t find (const char s, size_t pos 0) const; size_t find (const char s, size_t pos, size_t n) const; size_t find (char c, size_t pos 0) const;**
从字符串pos位置开始往后找字符c返回该字符在字符串中的位置 此处我使用的是省略第二个参数那么它所默认的位置就是从0位置开始查找也就是从S3字符串的h开始查找。 rfind则是反向查找
4.4 substr
string substr (size_t pos 0, size_t len npos) const; 在str中从pos位置开始截取n个字符然后将其返回 这是一个很好玩的接口从第n个字符开始截取字符串中m个字符返回赋予当我们知道某个分字符串在总字符串中的位置的时候就可以定向的将所知的分字符串赋予任意一变量 在string类中它充当的是字符串截取的功能