【C++】STL容器-string常用接口

1.string类的优势及重要性(部分)

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。

2. 标准库中的string类

2.1 string类(了解)

附文档链接:
SLT-string类

  1. 字符串是表示字符序列的类, string是表示字符串的字符串类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性,该类的接口与常规容器的接口基本相同,添加了一些专门用来操作string的常规操作。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作basic_string的默认参数,string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  5. (1)注意:这个类独立于所使用的编码来处理字节 :如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。不能操作多字节或者变长字符的序列。
    (2)在使用string类时,必须包含#include头文件以及using namespace std;(也可以单独展开命名空间域std:string)

2.string的常用接口介绍

(1)构造函数string类对象的常见构造

代码示例

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
	//1.默认构造
	string s1;
	//2.带参构造
	string s2("hello world");
	//3.拷贝构造
	string s3 = s2;
	//4.隐式类型转换
	string s4 = "hello world";
	//5.字符
	string s5(5,'x');
}

运行结果

!

(2) string类对象的容量操作

  • size使用示例

size和length的作用是一样的,只是为了适配其他容器,一般使用size

c 复制代码
//下标+[]
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
  • empty使用注意

这个程序,会引发越界访问和无限循环,这是因为只要s1一开始不为空且在后续循环中不被修改为空,也没有越界检查,循环就会一直进行下去。

修改:(说明:遍历字符串并不需要这么麻烦,这是为了提醒使用empty越界的错误演示)

c 复制代码
void test03()
{
	string s1("hello world");
	for(int i=0;!s1.empty();i++)
	{
		if (i == s1.size())
		{
			break;
		}
		cout << s1[i] ;
	}
}
  • clear使用示例
    说明:将s1中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小

reserve使用

说明:reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大

如果能提前确定所需空间大小,利用reserve提高插入数据的效率,避免增容带来的开销

resize使用示例

cpp 复制代码
void test03()
{
	string s("hi");
	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	// "aaaaaaaaaa"
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此时s中有效字符个数已经增加到15个
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数缩小到5个
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

}

(3)string类对象的修改操作

相关推荐
不想写代码的星星11 小时前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
樱木Plus2 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit4 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_5 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星5 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛7 天前
delete又未完全delete
c++
端平入洛8 天前
auto有时不auto
c++
哇哈哈20219 天前
信号量和信号
linux·c++
多恩Stone9 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马9 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost