C++ 23 String Views
当谈到C++中的字符串视图时,我们通常是指基于字符类型char
的std::basic_string_view
特化版本。字符串视图是指向字符串的非拥有引用,它代表了一系列字符的视图。这些字符序列可以是C++字符串或C字符串。使用<string_view>
头文件可以定义一个字符串视图。
从高层次来看,std::string_view的目的是避免复制已由其他程序拥有的数据,并允许对类似std::string
的对象进行不可变访问。字符串视图是一种受限制的字符串,仅支持不可变操作。此外,字符串视图string view
还有两个附加的可变操作:remove_prefix
和sv.remove_suffix
。
字符串视图是类模板,其参数为字符和字符特征(std::char_traits)
。字符特征(std::char_traits)
具有默认值。与字符串不同,字符串视图是非所有者的,因此不需要分配器。
template<
class CharT,
class Traits = std::char_traits<CharT>
> class basic_string_view;
根据字符串,字符串视图为基础字符类型char、wchar_t、char16_t和char32_t提供了四个同义词。
typedef std::string_view std::basic_string_view<char>
typedef std::wstring_view std::basic_string_view<wchar_t>
typedef std::u16string_view std::basic_string_view<char16_t>
typedef std::u32string_view std::basic_string_view<char32_t>
总的来说,C++中的字符串视图被用于优化不需要复制的字符串数据的处理,并提供不可变的访问。std::string_view
是最常用的字符串视图,用于代表char类型的字符串。
创建和初始化
可以创建一个空字符串视图。您还可以从现有的字符串、字符数组或字符串视图创建字符串视图。
非修改操作
为了使本章简洁,并避免重复描述字符串章节的详细信息,我仅提到字符串视图的非修改操作。请使用与字符串相关的文档链接获取更多详细信息。
- 元素访问:
operator[], at, front, back, data
- 容量:
size, length, max_size, empty
- 查找:
find, rfind, find_first_of, find_last_of, find_first_not_of, find_last_not_of
- 复制:
copy
调用stringView.swap(stringView2)
交换两个字符串视图的内容。
成员函数remove_prefix
和remove_suffix
是字符串视图独有的,因为字符串不支持这两个操作。
#include <iostream>
#include <string_view>
using namespace std;
int main()
{
string str = " A lot of space";
string_view strView = str;
strView.remove_prefix(min(strView.find_first_not_of(" "), strView.size()));
cout << str << endl //
<< strView << endl;
char arr[] = {
'A', ' ', 'l', 'o', 't', ' ', 'o', 'f', ' ',
's', 'p', 'a', 'c', 'e', '\0', '\0', '\0'
};
string_view strView2(arr, sizeof arr);
auto trimPos = strView2.find('\0');
if (trimPos != strView2.npos) strView2.remove_suffix(strView2.size() - trimPos);
cout << arr << ": " << sizeof arr << endl
<< strView2 << ": " << strView2.size() << endl;
return 0;
}
字符串视图不需要内存分配
如果您创建一个字符串视图或复制一个字符串视图,则不需要进行内存分配。
这与字符串形成了对比;创建或复制字符串需要进行内存分配。
#include <iostream>
#include <string_view>
using namespace std;
void* operator new(std::size_t count)
{
std::cout << " " << count << " 字节" << '\n';
return malloc(count);
}
void getString(const std::string&)
{
}
void getStringView(std::string_view)
{
}
int main()
{
std::string large = "012345678901234567890"
"1234567890123456789";
std::string substr = large.substr(10);
std::string_view largeStringView{
large.c_str(),
large.size()
};
largeStringView.remove_prefix(10);
getString(large);
getString("012345678901234567890"
"1234567890123456789");
const char message[] = "0123456789012345678901234567890123456789";
getString(message);
getStringView(large);
getStringView("012345678901234567890"
"1234567890123456789");
getStringView(message);
return 0;
}
【转自:滨海网站设计公司 http://www.1234xp.com/binhai.html 欢迎留下您的宝贵建议】