首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++STL之string

C++STL之string

作者头像
陈大大川
发布2025-12-30 15:19:18
发布2025-12-30 15:19:18
2300
举报

1.标准库string

1.auto和范围for

auto关键字

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个

不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型

指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期

推导而得

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

auto不能作为函数的参数,可以做返回值,但是建议谨慎使用。

auto不能直接用来声明数组。

代码语言:javascript
复制
#include<iostream>
using namespace std;
int func1()
{
return 10;
}
// 不能做参数
void func2(auto a)
{}
比特就业课
// 可以做返回值,但是建议谨慎使用
auto func3()
{
return 3;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = func1();
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
auto e;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
int x = 10;
auto y = &x;
auto* z = &x;
auto& m = x;
cout << typeid(x).name() << endl;
cout << typeid(y).name() << endl;
cout << typeid(z).name() << endl;
auto aa = 1, bb = 2;
// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
auto cc = 3, dd = 4.0;
// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
auto array[] = { 4, 5, 6 };
return 0;
}
代码语言:javascript
复制
#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
std::map<std::string, std::string> dict = { { "apple", "苹果" },{ "orange",
"橙子" }, {"pear","梨"} };
// auto的用武之地
//std::map<std::string, std::string>::iterator it = dict.begin();
auto it = dict.begin();
while (it != dict.end())
{
cout << it->first << ":" << it->second << endl;
++it;
}
return 0
}

范围for

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此

C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

范围for可以作用到数组和容器对象上进行遍历

范围for的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。

代码语言:javascript
复制
#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
// C++98的遍历
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
{
array[i] *= 2;
}
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
{
cout << array[i] << endl;
}
// C++11的遍历
for (auto& e : array)
e *= 2;
for (auto e : array)
cout << e << " " << endl;
string str("hello world");
for (auto ch : str)
{
cout << ch << " ";
}
cout << endl;
return 0;
}

1.string类的常用接口说明(常见)

函数名称

功能说明

string()

构造空的string类对象,即空字符串

string(const char* s)

用C-string来构造string类对象

string(size_t n, char c)

string类对象中包含n个字符c

string(const string&s)

拷贝构造函数

代码语言:javascript
复制
void Teststring()
{
string s1; // 构造空的string类对象s1
string s2("hello bit"); // 用C格式字符串构造string类对象s2
string s3(s2); // 拷贝构造s3
}

2.string类对象的容量操作

函数名称

功能说明

size

返回字符串有效字符长度

length

返回字符串有效字符长度

capacity

返回空间总大小

empty

检测字符串释放为空串,是返回true,否则返回false

clear

清空有效字符

reserve

为字符串预留空间

resize

将有效字符的个数改成n个,多出的空间用字符c填充

注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接

口保持一致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不

同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char

c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数

增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参

数小于string的底层空间总大小时,reserver不会改变容量大小

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

函数名称

功能说明

operator[]

返回pos位置的字符,const string类对象调用

begin+ end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器

rbegin + rend

begin获取一个字符的迭代器 + end获取最后一个字符下一个位 置的迭代器

范围for

C++11支持更简洁的范围for的新遍历方式

4. string类对象的修改操作

函数名称

功能说明

push_back

在字符串后尾插字符c

append

在字符串后追加一个字符串

operator+=

在字符串后追加字符串str

c_str

返回C格式字符串

find + npos

从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置

rfind

从字符串pos位置开始往前找字符c,返回该字符在字符串中的 位置

subst

在str中从pos位置开始,截取n个字符,然后将其返回

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差

不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可

以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留

好。

5. string类非成员函数

函数名称

功能说明

operator+

尽量少用,因为传值返回,导致深拷贝效率低

operator>>

输入运算符重载

operator<<

输出运算符重载

getline

获取一行字符串

relational operators

大小比较

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档