【C++】STL容器——string类的使用指南(含代码演示)(8)

简介: 【C++】STL容器——string类的使用指南(含代码演示)(8)

一、string类——基本介绍

  • string是表示字符串的字符串类。
  • 该类的接口与常规容器的接口基本相同,可以视作在常规接口基础上再添加了一些专门用来操作string的常规操作。
  • string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  • 不能操作多字节或者变长字符的序列。

二、string类——使用环境准备

  • 在使用string类时,必须包含#include<iostream> #include<string>以及 展开命名空间using namespace std;

三、string类——文档查看

  • 查看所有接口网站:https://cplusplus.com
  • PS:string不属于传统的STL容器,它的出现早于STL,所以要在Other中才能找到

四、string类——string常用接口总结

1. string类对象的【三(四)种基本构造】

【1】.三(四)种构造方式 [接口]

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

【2】.三(四)种构造方式 [代码演示]

void Teststring()
{
 string s1;                     //构造空的string类对象s1
 string s2("hello bit");        // 用C格式字符串构造string类对象s2
 string s4(10, '*');            //string类对象中包含10个字符*
 string s3(s2);                 // 拷贝构造s3
}

2. string类对象的容量操作

【1】容量操作函数总结

函数名称 功能说明
size(重点) 返回字符串有效字符长度 (与length相同,引入size命名区分,是为了与其他容器的接口保持一致,一般情况下基本都是用size()
length 返回字符串有效字符长度
capacity 返回空间总大小
empty (重点) 检测字符串释放为 空串 ,是 返回true 否则 返回false
clear (重点) 清空有效字符(不改变底层空间)
reserve (重点) 为字符串预留空间(当reserve的参数小于string的底层空间总大小时,reservr不会改变容量大小)
resize (重点) 将有效字符的个数该成n个,多出的空间用字符c填充(注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变)

【2】容量操作函数总结 [代码演示]

int main()
{
  string s1("hello world");
  cout << s1.size() << endl;
  cout << s1.length() << endl;
  cout << s1.max_size() << endl;
  cout << s1.capacity() << endl;
  size_t old = s1.capacity();
    s.resize(8);
    s.resize(13, 'x');
  return 0;
}

3. string类对象的访问及遍历操作

【1】string类对象的三种遍历操作 [要点总结]

函数名称 功能说明
下标 + [ ]
operator[] (重点) 返回pos位置的字符,const string类对象调用
迭代器 ( 任何容器都支持迭代器,并且用法是类似)
begin+ end begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rend begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围for

【2】string类对象的 访问及遍历操作 [代码演示]——下标 + [ ] (与数组下标访问操作符的对比)

与数组下标访问操作符的对比:

  • string访问的 [ ] 是操作符重载
  • 数组的 [ ] 是 指针移动
//与数组的下标访问符的区别
    char s3[] = "hello world";
    s3[1]++; // -> *(s3+1);数组指针移动
    s1[1]++; // s1.operator[](1); 操作符重载,改变ASCALL码
int main()
{
    string s0;
    string s1("hello world");
    // 遍历string
    // 下标+[]
    for (size_t i = 0; i < s1.size(); i++)
    {
      s1[i]++; //改变ASCALL码
    }
    cout << endl;
    for (size_t i = 0; i < s1.size(); i++)
    {
      cout << s1[i] <<" "; //遍历打印
    }
    cout << endl;
}

【3】string的 访问及遍历操作 [代码演示]——迭代器

iterator的使用 接口说明
begin +end(重点) 获取第一个数据位置的iterator/const_iterator, 获取最后一数据的下一个位置的iterator/const_iterator
rbegin + rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterat
  • 勉强可以将迭代器理解成为【指针】,该指针指向string中的某个节点。
  • 任何容器都支持迭代器,并且用法是类似
string::iterator it = s1.begin();
    while (it != s1.end())
    {
   // 写
    (*it)--;
     ++it;
    }
    cout << endl;
    it = s1.begin();
       while (it != s1.end())  //理解成迭代器指针从s1.begin()头位置通过while循环一直到不为s1.end()尾位置为止
    {
      // 读
      cout << *it << " ";
      ++it;
    }
      cout << endl;

【4】string类对象的 访问及遍历操作 [代码演示]——范围for

  • 范围for的底层替换为迭代器
  • 可以引入auto关键字省去识别操作
string s1("hello world");
  //for (char& ch : s1)
  for (auto& ch : s1)
  {
    ch++;
  }
  cout << endl;
  for (char ch : s1)
  {
    cout << ch << " ";
  }
  cout << endl;

五. string类对象的修改操作

【1】string类对象的修改操作 [三个场景总结]

函数名称 功能说明
场景一:
push_back 在字符串后尾插字符c
append 在字符串后追加一个字符串
场景二:
operator+= (重点) 在字符串后追加字符串str
c_str(重点) 返回C格式字符串
场景三:
find + npos(重点) 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置(npos该值表示“字符串的结尾位置” )
rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr 在str中从pos位置开始,截取n个字符,然后将截取的字符返回

!](https://ucc.alicdn.com/images/user-upload-01/f6bc3a09b2774a9c83a51d30c07e0ff6.png)

【2】场景一:尾插

//场景1:尾插
    string s1("hello");
  // 尾插入一个字符
  s1.push_back('x');
   尾插一个字符串
  s1.append("world");
  s1 += ' ';
  s1 += "world";
  cout << s1 << endl;

【3】场景二:int转换成string对象(+=操作符重载)

//场景2:int 类型转换成string对象
  size_t x = 0;
  cin >> x;
  string xstr;
  while (x)
  {
    size_t val = x % 10;
    xstr += ('0'+val);
    x /= 10;
  }

【4】场景三:分割一个网址中的 【协议 域名 资源名】 (find函数与npos)

//场景3:查找和截取 ————分割一个网址中的 【协议  域名  资源名】
    string url = "http://www.baidu.com/?tn=65081411_1_oem_dg";
    // http://www.baidu.com/?tn=65081411_1_oem_dg
  // 协议:protocol  域名:domain  资源名:uri
  string protocol;
  string domain;
  string uri;
  size_t pos1 = url.find("://");//记下pos1的位置
  if (pos1 != string::npos)   //npos该值表示“字符串的结尾位置”
  {
    protocol = url.substr(0, pos1);//截取协议
  }
  cout << protocol << endl;
  size_t pos2 = url.find('/', pos1 + 3);
  if (pos2 != string::npos)
  {
    domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));//截取域名
    uri = url.substr(pos2 + 1);//截取资源名
  }
  cout << domain << endl;
    cout << uri << endl;


相关文章
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
622 5
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
1167 1
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
521 11
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
420 0
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
874 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
581 9
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
373 1
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
798 6
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
705 12