|
内存处理
如下面的代码所示,当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 {&#34;Hello!!&#34;};
string strWorld {&#34;The World...&#34;};
auto position {strHello.find(&#34;!!&#34;)};
if (position != string::npos)
{
strHello.replace(position,2,strWorld.substr(3,6));
}
cout << strHello << endl;
输出如下:
Hello World
注意:
从 C++20 开始,std::string 是 constexpr 类。这意味着 string 可用于在编译期执行操作,并可用于 constexpr 函数和类的实现。 |
|