返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一起来看看C++STL容器之string类
  • 623
分享到

一起来看看C++STL容器之string类

2024-04-02 19:04:59 623人浏览 八月长安
摘要

目录前言1.标准库中的string类2.string类的常用接口说明2.1 string对象的常见构造2.2 string类对象的容量操作  2.2.1 rese

前言

为什么学习string类:

C语言中,字符串是以'\0'结尾的集合,为了操作方便,在C标准库中提供一些str系列的函数(strstr,strcmp,strcpy……),但是这些库函数和字符串时分离的,不太符合oop的思想。稍不留神就会造成越界访问。

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

1.标准库中的string类

1.string类是表示字符串的字符种类。

2.该类的接口与常规容器的接口基本相同,在添加一些专门用来操作string的常规操作。

3.string的底层是:basic_string模板类的别名。

4.不能操作多字节或者变长字符的序列。

在使用string的时候,必需包含头文件#include<string>以及using namespace std;

2.string类的常用接口说明

2.1 string对象的常见构造

string() 构造空的string类对象
string(const char* str)以常量字符创为参数构造string类
string(size_t n,char ch)string对象中包含了n个字符c
string(const string& s)

拷贝构造函数

#include<iOStream>
#include<string>
using namespace std;
int main()
{
	string s1;
	string s2("CSDN");
	string s3(4, 'A');
	string s4(s2);
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
}
 
[点击并拖拽以移动]
​

 运行结果:

2.2 string类对象的容量操作 

size返回字符串的有效长度
length和size一致,推荐使用size
capacity返回总空间大小
clear清空有效字符,但是不对capacity有影响
reserve为字符串预留空间
empty判断字符串是否为空串,返回值为bool
resize
将有效字符的个数该成n个,多出的空间用字符c填充

 2.2.1 reserve是如何开辟空间的

 void reserve (size_t n=0)

void TestPushBack()
{
	string s;
	size_t sz = s.capacity();
	for (int i = 0; i < 1000; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())//当sz和_capacity不相等的时候,说明reserve已经增容了。
		{
			static int n = 1;
			sz = s.capacity();
			printf("第%d次开辟空间:_capacity=%d\n", n++, sz);
		}
	}
}

运行结果:

说明在VS的环境下,reserve每次开辟的空间是前一次空间的约1.5倍。

2.2.2 clear 和 empty

 void clear ()

bool empty() const

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
	s1.clear();	
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
}

运行结果:

说明了clear只会清理有效的字符串,不会对空间的大小有影响,当clear后,empty的返回值为0,说明了此时的是s1是空字符串。

2.2.3 resize的用法

void resize(size_t n)

void resize(size_t n,char ch)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	s1.resize(10, 'A');//输出的是------>CSDNAAAAAAAA
	cout <<s1<< endl;
}

2.3 string类对象的访问以及遍历操作 

operator[ ]
返回 pos 位置的字符, const string 类对象调用
begin+end
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器 (正向迭代器)
rbegin+rend
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器 (反向迭代器)
范围forc++11支持的更简洁的遍历方式

const_iterator begin()const

iterator begin()

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	auto it1= s1.begin();//正向迭代器
	while (it1 != s1.end())//end指向的是最后一个元素的下一位
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	auto it2 = s1.rbegin();//反向迭代器
	while (it2 != s1.rend())
	{
		cout << *it2 << " ";
		it2++;
	}
}

运行结果:

范围for的使用

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	for (auto ch :s1)
		cout << ch<< " ";
}

本质上,范围for调用的是迭代器。

2.4 string类对象的修改操作 

push_back尾插字符ch
append尾插字符串str
operator+=尾插字符ch/尾插字符串
c_str返回C格式字符串
find+npos
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置,npos是size_t的最大值
rfind
从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr
在str中从pos位置开始,截取n个字符,然后将其返回

2.4.1 push_back 和 append 以及operator+=

void push_back(char ch)

string& append(const char* str)

string& operator+=(char ch)

string& operator+=(const char* str)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello ");
	s1.push_back('C');
	s1.append("SDN");
	cout << s1 << endl;
	string s2("hello ");
	s2 += 'w';
	s2 += "orld";
	cout << s2 << endl;
}

运行结果:

operator +=可以尾插字符,也可以尾插字符串。实际上,operator +=尾插字符的时候,调用的是push_back,尾插字符串的时候,调用的是append。

2.4.2  find 和 rfind 以及 substr

size_t find(char c,size_t pos=0) const

size_t rfind(char c,size_t pos=npos)

string substr(size_t pos=0,size_t len=npos)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	cout << s1.find('C') << endl;
	cout << s1.rfind('C',0) << endl;//从pos=0处,即字符'h'往前找,找不到字符'C'返回的是npos
	                                //npos是size_t中的最大值--->4294967295
	cout << s1.rfind('C', 8) << endl;
	cout << s1.substr(2, 3) << endl;//从字符串的第二个位置开始,截取len=3个字符
}

运行结果:

2.5 string非成员函数重载

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: 一起来看看C++STL容器之string类

本文链接: https://lsjlt.com/news/141546.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一起来看看C++STL容器之string类
    目录前言1.标准库中的string类2.string类的常用接口说明2.1 string对象的常见构造2.2 string类对象的容量操作  2.2.1 rese...
    99+
    2024-04-02
  • C++STL容器中string类怎么用
    这篇文章将为大家详细讲解有关C++STL容器中string类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言为什么学习string类:在C语言中,字符串是以'\0'结尾的集合,为了...
    99+
    2023-06-29
  • 一起来看看JavaScript数据类型最详解
    目录01-变量的数据类型02-简单数据类型之数字型Number03-isNaN04-简单数据类型之字符串型05-转义符案例-弹出网页警示框06-字符串拼接07-字符串拼接加强08-显...
    99+
    2024-04-02
  • 一起来看看python的装饰器代码
    装饰器通用模型 def wrapper(fn): def inner(*args, **kwargs): ret = fn(*args, **kwargs) ...
    99+
    2024-04-02
  • 一起来看看C语言世界中的结构体
    目录一、结构体的概念:二、结构体变量的定义和初始化结构体变量的定义(1)单独定义(2)混合定义(在定义结构体的同时定义结构体变量)结构体变量的初始化 三、结构体变量的使用(...
    99+
    2024-04-02
  • 一起来看看C语言的预处理注意点
    目录C 预处理器1.取消已定义宏2.使用#ifdef来调试常用预定义宏预处理器运算符 1.宏延续运算符2.字符串常量化运算符#3.标记粘贴运算符##参数化的宏总结C 预处理...
    99+
    2024-04-02
  • 一起来看看C语言线性表的线性链表
    目录定义1.插入2.建立线性链表1)头插法2)尾插法3.删除4.查找5.求线性链表的表长总结定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,每一个结点包含两个域:存放数据...
    99+
    2024-04-02
  • C++设计模式中的观察者模式一起来看看
    设计模式:观察者模式 观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。 发布者接口 #ifndef __observerPatterns_publish_hpp__ #d...
    99+
    2024-04-02
  • 阿里云服务器拼团活动在哪?一起来看!
    本文主要介绍了阿里云服务器拼团活动的具体位置,以及如何参与拼团,以帮助大家更好地利用阿里云服务器资源。 在当今信息化社会,互联网应用越来越广泛,云计算服务成为了一种非常流行的计算模式。而阿里云作为中国最大的云计算服务提供商,其服务器产品受到...
    99+
    2023-11-05
    阿里 服务器
  • [C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调
    文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 ...
    99+
    2023-08-30
    c++ 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作