【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

7 篇文章 1 订阅

在这里插入图片描述

🔥个人主页: Forcible Bug Maker
🔥专栏: STL || C++

前言

本篇博客主要内容:STL库中string的容量接口(Capacity)和四种元素获取方式(Element access)的介绍和使用

来到string类的使用第二篇,让我们接着上一篇来讲。

🔥容量接口(Capacity)

在这里插入图片描述

size和length

在这里插入图片描述
在这里插入图片描述
size_t size() const;
size_t length() const;
将这两个函数接口的功能完全相同,它们没有参数传递,只有一个返回值(且这个返回值是const类型,不能被改变),返回:string对象中串的长度

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("Test string");
	// string::size
	cout << "字符串长度为" << str.size() << endl;

	// string::length
	cout << "字符串长度为" << str.length() << endl;
	return 0;
}

在这里插入图片描述
至于为什么设计了两个功能相同的函数,这就牵扯到STL的发展史了。string是STL库中最早被实现的内容之一,当时获取字符串长度的时候只有length,并没有size。但随着STL的发展,陆续出现了vector,list,stack,queue这样的容器,在获取他们的元素个数时,使用的接口函数名用length(长度)似乎不太合适,于是选用了size(大小),string为了和别的容器保持一致,不得已也给自己加了一个size上去。

capacity

在这里插入图片描述
size_t capacity() const;
返回值:当前string对象中给串分配的字节数

这个分配的容量不一定和string的长度(length)相等,它可以等于或大于length的大小,它额外的空间可以优化对象往串中增加字符时的操作。如果string的容量(capacity)和串的长度(length)相等的话,那么当你向string对象的串中增加字符时,会导致每次的增加操作都会重新让存储串的空间扩一次容。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("Test string");
	cout << "size: " << str.size() << "\n";
	cout << "length: " << str.length() << "\n";
	cout << "capacity: " << str.capacity() << "\n";
	return 0;
}

在这里插入图片描述
如果看过我之前数据结构部分的内容,其实就不难理解capacity和length之间的区别。
可以看看我之前数据结构的这篇:初阶数据结构—顺序表和链表(C语言),里面capacity和size的道理和这里相同。

max_size

在这里插入图片描述
size_t max_size() const;
返回值:string可以开辟的最大长度

使用案例:

// comparing size, length, capacity and max_size
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("Test string");
	cout << "size: " << str.size() << "\n";
	cout << "length: " << str.length() << "\n";
	cout << "capacity: " << str.capacity() << "\n";
	cout << "max_size: " << str.max_size() << "\n";
	return 0;
}

在这里插入图片描述
你可能会感叹,string竟然可以开这么大。可max_size的大小简单计算一下,已经有两个G了。计算机其实开不了这么大,其中涉及到很多别的因素。而且在coding中基本上也想不到用这个,所以此函数实际没什么作用。

reserve

在这里插入图片描述
void reserve (size_t n = 0);
这是改变string对象capacity大小的一个命令,能将capacity的大小改变使其大于等于n

如果n比当前对象的capacity大,则这个函数会将string对象扩容至大于等于n。
当n小于capacity时,这个行为是为被C++标准定义的,具体行为取决于编译器:

  1. 一种编译器(如VS),会选择无视这条命令,cpacity保持原来的大小。
  2. 另一种编译器(Linux下的g++),比较听话,会将string对象缩容使capacity等于n。

这个接口函数不会改变string串中的内容和length的大小

无返回值

使用样例:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    string str("hello world");
    cout << str.length() << endl;
    cout << str.capacity() << endl;
    cout << endl;

    str.reserve(100);

    cout << str.length() << endl;
    cout << str.capacity() << endl;
    return 0;
}

在这里插入图片描述

resize

在这里插入图片描述
void resize (size_t n);
void resize (size_t n, char c);
将string对象的length改变为n

如果n小于当前string对象的length,那么string对象的串将被缩短,超出n部分的内容会被移除。
如果n大于当前string对象的length,如果没有提供第二个参数c,阔出来的新内容将会被'\0'填充;否则会被第二个参数“字符c”填充。

当n大于capacity的时候,string对象也会被扩容,使capacity增加至大于等于n

无返回值

使用样例:

// resizing string
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("hello world");
	cout << str << endl;
	size_t sz = str.length();

	str.resize(sz + 4, 'x');
	cout << str << endl;

	// '\0'表示空,不会被打印
	str.resize(sz + 5);
	cout << str << endl;

	str.resize(sz);
	cout << str << endl;
	return 0;
}

在这里插入图片描述

clear

在这里插入图片描述
void clear();
将string串中的内容都删除,使其变成空串(length变成0),但容量capacity不会改变

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("hello world");
	cout << str << endl;
	cout << "str.size():" << str.size() << endl;
	cout << "str.capacity():" << str.capacity() << endl;

	str.clear();

	cout << str << endl;
	cout << "str.size():" << str.size() << endl;
	cout << "str.capacity():" << str.capacity() << endl;
	return 0;
}

在这里插入图片描述

empty

在这里插入图片描述
bool empty() const
返回值:string串的长度(length)是否为0,如果为零,返回真(true,1),如果不为零,返回假(false,0)

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str1("hello world");
	string str2;

	cout << "str1.length():" << str1.length() << endl;
	cout << "str2.length():" << str2.length() << endl;

	cout << endl;

	cout << "str1.empty():" << str1.empty() << endl;
	cout << "str2.empty():" << str2.empty() << endl;
	return 0;
}

在这里插入图片描述

shrink_to_fit

在这里插入图片描述
void shrink_to_fit();
C++11新增接口。
此接口函数的作用是缩容,但是其具体怎么实现,其实也是C++未定义的。其作用和reserve,n小于capacity时的情况差不多,不同编译器会有不同的解释和实现。

注:缩容对编译器来说开销一般都不小,所以非必要情况少使用缩容。

🔥元素获取(Element access)

在这里插入图片描述

operator[ ]

在这里插入图片描述
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
学过类和对象操作符重载的都知道,这里是一个[ ]的操作符重载,可以通过 方括号[ ]+下标获取串中的元素的引用

注:同时重载了const版本的方括号[ ]访问,当string对象为const类型时,下标获取的元素只能读,不能改。

代码样例和at放一起了。

at

在这里插入图片描述
char& at (size_t pos);
const char& at (size_t pos) const;
at的功能和operator[ ]相同,都是通过下标访问串中的元素。当string对象为非const类型时,也可以使用此访问对串进行内容上的改动。

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    // operator[]
    string str("Test string");
    str[1] = 'T';
    for (int i = 0; i < str.length(); ++i)
    {
        cout << str[i] << " ";
    }
    cout << endl;

    // at
    str.at(2) = 'T';
    for (int i = 0; i < str.length(); ++i)
    {
        cout << str.at(i) << " ";
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

注:at和operator[ ]也有区别,当下标pos越界时,使用at访问程序会抛异常,能被try…catch捕获;而用operator[ ]访问则会直接报错

back和front

C++11新增语法。
在这里插入图片描述
char& back();
const char& back() const;
返回string对象串的末尾元素的引用

非const类型的string对象可以通过此函数更改串元素内容。

在这里插入图片描述
char& front();
const char& front() const;
返回string对象串的首元素的引用

非const类型的string对象可以通过此函数更改串元素内容。

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("test string");
	str.front() = 'T';
	str.back() = 'G';
	cout << str << endl;
	return 0;
}

在这里插入图片描述

结语

本篇博客,介绍了9个容量接口(Capacity),它们有查询string串长度和更改长度的(size,length,resize),也有查询容量和更改容量的(capacity,reserve),和清理的(clear)。同时也讲到了种访问string对象串中元素的四种方式(operator[ ],at,front和back)。以上所提到各种接口和方法能让我们更加方便的操控string对象中的容量和内容,在熟练它们之后,就可以尽量避免使用那烦人的静态字符数组了
博主会继续分享关于string类的使用以及STL更多的内容,感谢大家的支持。♥

  • 94
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 155
    评论
stringC++的标准库中提供的一个字符串处理,它可以方便地进行字符串的存储、操作和输出。下面详细介绍一下string使用。 1. string的定义 我们可以用以下方式来定义一个string型的变量: ```c++ string str; ``` 2. string的赋值 我们可以使用以下方式对字符串进行赋值: ```c++ string str = "Hello World!"; string str1("Hello World!"); string str2(str1); ``` 3. string的长度 使用以下方式可以获取string型变量的长度: ```c++ string str = "Hello World!"; int len = str.length(); //获取字符串长度 ``` 4. string的拼接 使用加号(+)可以将两个字符串拼接起来: ```c++ string str1 = "Hello "; string str2 = "World!"; string str = str1 + str2; ``` 也可以使用append()函数将一个字符串追加到另一个字符串末尾: ```c++ string str1 = "Hello "; string str2 = "World!"; str1.append(str2); ``` 5. string的比较 我们可以使用以下方式比较两个字符串是否相等: ```c++ string str1 = "Hello"; string str2 = "hello"; if(str1 == str2) { cout << "相等" << endl; } else { cout << "不相等" << endl; } ``` 在比较时,string会自动忽略大小写。 6. string的查找 我们可以使用以下方式查找一个字符串中是否包含另一个字符串: ```c++ string str = "Hello World!"; string sub = "World"; int pos = str.find(sub); //查找子串的位置 if(pos != string::npos) { cout << "包含" << endl; } else { cout << "不包含" << endl; } ``` find()函数会返回子串在字符串中的位置,如果没有找到则返回string::npos。 7. string的截取 我们可以使用以下方式对字符串进行截取: ```c++ string str = "Hello World!"; string sub = str.substr(6, 5); //从第6个字符开始截取长度为5的子串 cout << sub << endl; ``` 8. string的转换 我们可以使用以下方式将字符串转换为数字: ```c++ string str = "123"; int num = stoi(str); //将字符串转换为整数 cout << num << endl; ``` 也可以使用以下方式将数字转换为字符串: ```c++ int num = 123; string str = to_string(num); //将整数转换为字符串 cout << str << endl; ``` 9. string的输入输出 我们可以使用以下方式对string型变量进行输入输出: ```c++ string str; cin >> str; //从标准输入读取一个字符串 cout << str << endl; //将字符串输出到标准输出 ``` 以上就是string的基本使用方法,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 155
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forcible Bug Maker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值