IE盒子

搜索
查看: 93|回复: 0

C++20 中 string 和 string_view(五)

[复制链接]

5

主题

10

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2023-2-28 16:39:31 | 显示全部楼层 |阅读模式
内存处理

如下面的代码所示,当string操作需要扩展string时,string类能够自动处理内存需求,因此不会再出现内存溢出的情况了。
string myString { "hello" };
myString += ", there" ;
string myOtherString { myString };
if (myString == myOtherString) {
    myOtherString[0]='H';
}
cout << myString << endl;
cout << myOtherString<< endl;
这段代码的输出如下所示。

hello, there
Hello,there

在这个例子中有几点需要注意。

一是要注意即使字符串被分配和调整大小,也不会出现内存泄漏的情况。

所有这些 string 对象都创建为栈中的变量。

尽管 string 类肯定需要完成大量分配内存和调整大小的工作,但是 string 类的析构函数会在 string 对象离开作用域时清理内存。

另外需要注意的是,运算符以预期的方式工作。

例如,= 运算符复制字符串,这是最有可能预期的操作。

如果习惯使用基于数组的字符串,那么这种方式有可能带来全新体验,也可能令你迷惑。

不用担心,一旦学会信任 string 类能做出正确的行为,那么代码编写会简单得多。

与 C 风格字符串的兼容

为达到兼容的目的,还可应用 string 类的 c_str() 方法获得一个表示 C 风格字符串的 const char 指针。

不过,一旦 string 执行任何内存重分配或 string 对象被销毁了,返回的这个 const 指针就失效了。

应该在使用结果之前调用这个方法,以便它准确反映 string 当前的内容。

永远不要从函数中返回在基于栈的 string 上调用 c_str() 的结果。

还有一个 data() 方法,在 C++14 及更早的版本中,始终与 c_str() 一样返回 const char

从 C++17 开始,在非 const 字符串上调用时,data() 返回 char。
string 上的操作

string 类支持一系列其他的操作,以下是一部分:

substr(pos,len):返回从给定位置开始的给定长度的子字符串。
find(str):如果找到了给定的子串,返回它的位置;如果没有找到,返回 string::npos。
replace(pos,len,str):将字符串的一部分(给定开始位置和长度)替换为另一个字符串。
starts_with(str)/ends_with(str):如果一个字符串以给定的子串开始或者结尾,则返回 true。

这是一个小代码片段,展示了其中的一些操作。
string strWorld {"Hello!!"};
string strWorld {"The World..."};
auto position {strHello.find("!!")};
if (position != string::npos)
{
    strHello.replace(position,2,strWorld.substr(3,6));
}
cout << strHello << endl;
输出如下:

Hello World

注意:

从 C++20 开始,std::string 是 constexpr 类。这意味着 string 可用于在编译期执行操作,并可用于 constexpr 函数和类的实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表