C++中的string的介绍(从string到STL)

C++中的string的介绍

文章目录

  • C++中的string的介绍
    • [1. 从string到STL](#1. 从string到STL)
    • [2. string 的构造函数](#2. string 的构造函数)
    • [3. string 的iterator(迭代器)](#3. string 的iterator(迭代器))
    • [4. string 中的元素访问](#4. string 中的元素访问)
    • [5. string 中容量相关](#5. string 中容量相关)
    • [6. string 中的插入删除](#6. string 中的插入删除)
    • [7. string 中的查找](#7. string 中的查找)
    • [8. string 的剩余函数](#8. string 的剩余函数)

1. 从string到STL

严格来说string不是Containers 容器,也就不属于STL C++ 标准模板库,因为string是早于STL的,所以没有作业可以抄,导致string中有很多,约100多个,有很多功能是相似的,所以只介绍一些常用的函数,虽然Containers 容器 中有很多不同类模板,但函数命名以及函数的形参是类似的,读懂一个类模板就基本明白了

string本质上就是一个存储char类型的顺序表

类似:

  • char* _ptr
  • size_t _size
  • size_t _capacity

2. string 的构造函数

  • (1) string的默认构造(用户不写由编译器自动生成的),生成空字符串
    string s;

  • (2)string的拷贝构造,用另一个string拷贝构造
    string s1(s2);

  • (3) 用string pos位置开始,向后 len个长度的部分,拷贝构造string
    pos为缺省参数,不写则为 0
    len为缺省参数,不写则为npos是string的成员常量,为size_t npos = -1,也就是整型的最大值
    string s1(s2,0,10);

  • (4) 用一个字符串构造
    string s("hello world");

  • (5) 用一个字符串的前N个构造
    string s("hello world",5);

  • (6) 用N个c构造
    string s(5,'x');

  • (7) 用迭代区间构造(下面会提到)

3. string 的iterator(迭代器)

迭代器是C++标准模板库(STL)中的一个核心概念,用来遍历容器中的元素,类似于指针,可以说指针是一种迭代器,但不能说迭代器是指针,因为你不知道迭代器的底层是什么

VS2022 x86下的迭代器类型

  • begin 返回指向第一个元素的迭代器,提供了const和非const两个版本(其他的也一样)

  • end返回指向最后一个元素的下一个位置的迭代器

  • rbegin是逆序迭代器,返回指向最后一个元素的下一个位置

  • end返回指向第一个元素的迭代器

4. string 中的元素访问

  • operator[]是通过像数组一样,用下标的方式来访问
    s[5];
  • at类似于operator[],只不过at会进行边界的强制检查,越界则会抛出异常,而operator[]不会对边界进行检查
    s.at(5);
  • backfront返回最后/第一个元素的引用
    s.back() / s.front();

遍历string的三种方法

    1. operator[] 通过下标来访问数据
cpp 复制代码
string s("hello wolrd");
for (int i = 0; i < s.size(); ++i)\
{
	cout << s[i] << " ";
}
cout << endl;
    1. iterator 通过迭代器来访问 迭代器需配对使用,正序对正序,逆序对逆序
cpp 复制代码
string s("hello wolrd");
//正序打印
string::iterator it = s.begin();
while (it != s.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;
//逆序打印
string::reverse_iterator it = s.rbegin();
while (it != s.rend())
{
	cout << *it << " ";
	++it;
}
cout << endl;
//const的string打印
const string s("hello wolrd");
string::const_iterator it = s.begin();
while (it != s.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;
    1. 范围for 通过自动判断开始和结束,以及自动++
cpp 复制代码
	string s("hello wolrd");
	for (auto ch : s)
	{
		cout << ch << " ";
	}
	cout << endl;

5. string 中容量相关

  • size length 返回string的字符个数,length 是只针对string ,而size 是所有容器都有的成员函数

  • max_size 返回最大能容纳的长度

  • capacity 返回string 的容量

  • clear 清空string

  • empty 判断string是否为空

  • shrink_to_fit将string缩小至合适的容量,避免空间浪费

  • resize 调整string 的大小,会删除多余的元素

  • reserve 调整string 的容量,一般情况下,如果调整的容量要小于原本的容量,编译器不会进行缩容的

cpp 复制代码
	string str("Hello World.");
	str.reserve(111);//扩容至111
	str.resize(5);  //调整元素个数为5,删除多余元素
	str.reserve(50); //不改变大小

6. string 中的插入删除

  • operator+= 在结尾添加一个string/一个字符串/一个字符

  • append 在结尾追加一个string/string的一部分/一个C字符串/一个C字符串的前N个/N个c字符/一个迭代区间

  • push_back 尾插一个字符

  • insertpos位置开始插入一个string/从pos位置开始插入一个string的一部分/从pos位置开始插入一个C字符串/从pos位置开始插入一个C字符串的前N个/从pos位置开始插入N个c字符/从迭代器位置开始插入N个c字符/从迭代器位置开始插入一个字符/从迭代器位置开始插入一段迭代区间

  • assign用一个string的值修改原string/用string的一部分来修改原string/用一个C字符串来修改原string/用一个C字符串的前N个来修改原string/用N个c字符来修改原string/用一个迭代区间的值来修改原string

  • erase默认全删除(或者传一段范围,如果len大于pos之后的长度则删除pos之后的全部字符)/删除一个迭代器指向的字符/删除一段迭代区间的字符

  • swap 交换两个string

  • pop_back尾删一个字符operator+=

可以看到在string中有许多重复功能的函数,例如push_back appendoperator+=,都使用operator+=来尾插字符不是更好嘛,所以string在设计上有很多重复的地方,只需要了解常见的函数即可

7. string 中的查找

  • c_str 返回字符串首元素的地址

  • find 查找第一个符合要求下标
    str.find("hello")//找到单词hello

  • rfind 逆序查找第一个符合要求下标

  • find_first_of find_last_of查找任意一个符合要求的下标(可以有多个要求)
    str.find_first_of("aeiou")//找到a e i o u任意一个第一次出现的下标

  • find_first_of find_last_of查找任意一个不符合要求的下标

  • substr 生成子串(从pos向后len个字符,并返回这部分string)

8. string 的剩余函数

  • operator>> operator<< 允许string像内置类型一样输入输出
  • operator= 是string的赋值重载,类似与assign的功能,将新的值赋值给string
相关推荐
杨荧1 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰8 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_0112 分钟前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
XuanRanDev17 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
gkdpjj18 分钟前
C++优选算法十 哈希表
c++·算法·散列表
代码猪猪傻瓜coding18 分钟前
力扣1 两数之和
数据结构·算法·leetcode
王俊山IT20 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。22 分钟前
c++多线程
java·开发语言
-Even-22 分钟前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
小政爱学习!24 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript