STL string 深析¶
当我们使用C++时,
在
还有一些固定宽度的特定字符串,比如std::u32string(即std::basic_string
在C++20中,引入了char8_t,这也带来了std::u8string(即std::basic_string
C++11¶
在C++11标准下,字符串处理主要依赖于std::string类,这是一个动态分配内存的字符串类。此外,引入了新的固定宽度字符串类型,如std::u32string和std::u16string,为处理Unicode字符提供了更好的支持。
#include <iostream>
#include <string>
int main() {
// 使用std::string
std::string str = "Hello, C++11!";
// 使用std::u32string和std::u16string
std::u32string u32str = U"Hello, Unicode!";
std::u16string u16str = u"Hello, Unicode!";
std::cout << str << std::endl;
std::wcout << u32str << std::endl;
std::wcout << u16str << std::endl;
return 0;
}
C++17¶
在C++17中,引入了
这在需要读取字符串但不需要修改它的函数中特别有用。与**为函数创建字符串副本**不同,我们可以简单地查看现有字符串!此外,
#include <iostream>
#include <string>
#include <string_view>
void printString(std::string_view str) {
std::cout << str << std::endl;
}
int main() {
std::string_view strv{"strv"}; // C++ string_view
printString(strv);
std::string str{"str"}; // C++ string
printString(str);
char cstr[] = "cstr"; // C-style string
printString(cstr);
return 0;
}
输出:
在这个例子中,printString函数以std::string_view作为参数,这使得这个函数非常轻量级和灵活,因为没有制作任何字符串的副本,这个函数可以通过传递C和C++样式的字符串以各种方式使用。
C++20¶
在C++20中,引入了一些新的有用成员函数,包括starts_with(…)和ends_with(…)。正如名称所示,这些函数确定一个字符串(或字符串视图)是否以某个字符或某个std::string_view开头/结尾。以下是一个简单的例子:
#include <cassert>
#include <string>
#include <string_view>
int main() {
const std::string str{"Hello World!"};
assert(str.starts_with('H'));
assert(str.ends_with('!'));
assert(str.starts_with("Hello")); // 隐式转换为std::string_view
assert(str.ends_with("World!")); // 隐式转换为std::string_view
return 0;
}
C++23¶
C++23中引入了contains,用于检查字符串是否包含指定的子字符串。
// 这是一个假设的C++23示例,实际上并不可用
#include <iostream>
#include <string>
int main() {
std::string str = "C++23 introduces contains function.";
if (str.contains("introduces")) {
std::cout << "The string contains 'introduces'." << std::endl;
} else {
std::cout << "The string does not contain 'introduces'." << std::endl;
}
return 0;
}
https://en.cppreference.com/w/cpp/string/basic_string/contains
结论¶
在处理新的C++代码中的字符串时,应考虑使代码尽可能灵活和内存高效。使用