【C++】标准库类型string

简介: 【C++】标准库类型string

string类简介

       在实际开发中会经常使用字符串,所谓的字符串就是指一连串的字符,它由许多单个字符连接而成。字符串中可以包含任意任意字符,这些字符必须包含在一对英文双引号( " " )之内,例如"abc"。C++中定义了String类来封装字符串,并提供了一系列操作字符串的方法,它们都位于<string>头文件中。

       我们先来看一下https://legacy.cplusplus.com/网站对string类的文档介绍:string类文档

总结如下:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,即:
typedef basic_string<char, char_traits, allocator>string;
  1. 不能操作多字节或者变长字符的序列。
  2. 在使用string类时,必须包含#include头文件以及using namespace std;

string类常用接口(成员函数)

string类对象默认成员函数

string类对象构造函数

       如下,C++98标准中对于string类实现了7个重载的构造函数:string类查询文档

       其参数解析如下:

        接下来我们演示使用如下四种常见的string类构造函数:

函数名称 功能说明
string() 构造空的string类对象,即空字符串
string(const char* s) 用C-string来构造string类对象
string(size_t n,char c) string类对象中包含n个字符c
string(const string&s) 拷贝构造函数

       如下代码,分别按上述构造函数顺序调用了相应构造函数初始化了4个string类对象:

#include<iostream>
#include<string>
 
using namespace std;
 
int main()
{
  //构造空的string类对象,即空字符串
  string s1;
  //用C-string来构造string类对象
  string s2("hello world");
  //string类对象中包含n个字符c
  string s3(5, 'x');
  //拷贝构造函数
  string s4(s2);
 
  cout << s1 << endl;
  cout << s2 << endl;
  cout << s3 << endl;
  cout << s4 << endl;
 
  return 0;
}

       运行程序,构造类对象效果如下:


string类对象析构函数

       如下,C++中对于string类实现了1个析构函数:

       该函数没有参数,没有返回值,在类对象生命周期结束后自动调用销毁类对象.


string类对象赋值运算符重载函数

   如下,C++98标准中对于string类实现了3个重载的赋值运算符重载函数:

         接下来我们演示使用这三种常见的string类赋值运算符重载函数:

         如下代码,分别按上述赋值运算符重载函数顺序调用了相应赋值运算符重载函数赋值了3次string类对象s4:

int main()
{
  //构造空的string类对象,即空字符串
  string s1;
  //用C-string来构造string类对象
  string s2("hello world");
  //string类对象中包含n个字符c
  string s3(5, 'x');
  //拷贝构造函数
  string s4(s2);
 
  cout << s4 << endl;
 
  s4 = s3;
  cout << s4 << endl;
 
  s4 = "ABCDEF";
  cout << s4 << endl;
 
  s4 = 'Y';
  cout << s4 << endl;
 
  return 0;
}

         运行程序,赋值运算符重载效果如下:


string类对象的迭代遍历及元素访问操作

       string类对象的迭代器相关函数共有8个,如下:

       string类对象的元素访问相关函数共有四个,如下:

          接下来我们演示学习几种常见的string类对象的迭代遍历及元素访问函数:

函数名称 功能说明
operator[] 返回pos位置的字符,const string类对象调用
begin+end begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器
rbegin+rend begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器
范围for C++支持更简洁的范围for的新遍历方式

operator[]运算符重载定义:operator[]文档链接

operator[]遍历string类对象:

#include<iostream>
#include<string>
using namespace std;
 
int main()
{
  string st1("Hello world");
  
  for (size_t i = 0; i < st1.size(); i++)
  {
    cout << st1[i] << endl;
  }
 
 
  return 0;
}

operator[]遍历效果如下:


operator[]修改string类对象:

       因为operator[]返回的是引用类型,因此可以利用其对string对象进行修改:

int main()
{
  string st1("Hello world");
  
  for (size_t i = 0; i < st1.size(); i++)
  {
    ++st1[i];
    cout << st1[i] << endl;
  }
 
  return 0;
}


operator[]重载访问string类对象和内置类型访问数组成员的区别:

begin+end迭代器顺序遍历访问字符串:

begin()函数定义如下:

end()函数定义如下:


begin+end迭代器顺序遍历访问string类对象:

int main()
{
  string st1("Hello world");
  //迭代器
  string::iterator it = st1.begin();
  while (it != st1.end())
  {
    cout << *it << endl;
    ++it;
  }
 
  return 0;
}

begin+end迭代器顺序遍历访问效果如下:

begin+end迭代器修改string类对象:

int main()
{
  string st1("Hello world");
  //迭代器
  string::iterator it = st1.begin();
  while (it != st1.end())
  {
    ++(*it);
 
    cout << *it << endl;
    ++it;
  }
 
  return 0;
}

begin+end迭代器修改string类对象效果如下:

rbegin+rend逆序遍历访问string类对象:

rbegin()函数定义如下:

rend()函数定义如下:


使用rbegin+rend迭代器反向遍历访问string类对象:

int main()
{
  string st1("Hello world");
 
  //反向迭代器
  string::reverse_iterator rit = st1.rbegin();
  while (rit != st1.rend())
  {
    cout << *rit << endl;
    ++rit;
  }
 
  return 0;
}

rbegin+rend迭代器反向遍历访问string类对象效果如下:

使用rbegin+rend反向迭代器修改string类对象:

int main()
{
  string st1("Hello world");
 
  //反向迭代器
  string::reverse_iterator rit = st1.rbegin();
  while (rit != st1.rend())
  {
    ++(*rit);
    cout << *rit << endl;
    ++rit;
  }
 
  return 0;
}

rbegin+rend反向迭代器修改string类对象效果如下:

       C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量, 第二部分则表示被迭代的范围。(注:知道数据类型的情况下可以不使用auto关键字自动推导类型)

范围for顺序访问string类对象:

int main()
{
  string st1("Hello world");
 
  for (auto ch : st1)
  {
    cout << ch << endl;
  }
 
  return 0;
}

范围for顺序访问string类对象效果如下:

范围for修改string类对象:

int main()
{
  string st1("Hello world");
 
  for (auto &ch : st1)
  {
    ch++;
    cout << ch << endl;
  }
 
  return 0;
}

范围for修改string类对象效果如下:

注:范围for在底层会替换成迭代器!


string类对象的容量操作

       string类对象容量相关操作函数共有9个,如下:

           接下来我们演示学习几种常见的string类对象的容量操作函数:

函数名称 功能说明
size 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty 检测字符串释放为空串,是返回true,否则返回false
clear 清空有效字符
reserve 为字符串预留空间
resize 将有效字符的个数改成n个,多出的空间用字符c填充

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

string类对象的字符串修改操作

       string类对象的字符串修改函数共有21个,如下:

常用的字符串修改操作:

函数名称 功能说明
push_back 在字符串后尾插字符c
append 在字符串后追加一个字符串
operator+= 在字符串后追加字符串str
c_str 返回C格式字符串
find+nops 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr 在str中从pos位置开始,截取n个字符,然后将其返回

string类的非成员函数

       非成员函数重载共有6个,如下:

常用的非成员函数

函数名称 功能说明
operator+ 尽量少用,因为传值返回,导致深拷贝效率低
operator>> 输入运算符重载
operator<< 输出运算符重载
getline 获取一行字符串
relational operators 大小比较

结语

希望这篇关于C++string类的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!





相关文章
|
22天前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
53 6
|
22天前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
60 5
|
21天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
22天前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
44 1
|
24天前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
48 4
|
30天前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
24 3
|
1月前
|
C++ 容器
|
1月前
|
C++ 容器
|
26天前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
43 0
|
26天前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
34 0