C++ 23 String Views

C++ 23 String Views

当谈到C++中的字符串视图时,我们通常是指基于字符类型charstd::basic_string_view特化版本。字符串视图是指向字符串的非拥有引用,它代表了一系列字符的视图。这些字符序列可以是C++字符串或C字符串。使用头文件可以定义一个字符串视图。

从高层次来看,std::string_view的目的是避免复制已由其他程序拥有的数据,并允许对类似std::string的对象进行不可变访问。字符串视图是一种受限制的字符串,仅支持不可变操作。此外,字符串视图string view还有两个附加的可变操作:remove_prefixsv.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
  • typedef std::wstring_view std::basic_string_view
  • typedef std::u16string_view std::basic_string_view
  • typedef std::u32string_view std::basic_string_view

总的来说,C++中的字符串视图被用于优化不需要复制的字符串数据的处理,并提供不可变的访问。std::string_view是最常用的字符串视图,用于代表char类型的字符串。

创建和初始化

可以创建一个空字符串视图。您还可以从现有的字符串、字符数组或字符串视图创建字符串视图。
C++ 23 String Views_第1张图片

非修改操作

为了使本章简洁,并避免重复描述字符串章节的详细信息,我仅提到字符串视图的非修改操作。请使用与字符串相关的文档链接获取更多详细信息。

  • 元素访问: 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_prefixremove_suffix是字符串视图独有的,因为字符串不支持这两个操作。

#include 
#include 

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;
}

image-20230410212004644

字符串视图不需要内存分配

如果您创建一个字符串视图或复制一个字符串视图,则不需要进行内存分配。

这与字符串形成了对比;创建或复制字符串需要进行内存分配。

#include 
#include 

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;
}

C++ 23 String Views_第2张图片

你可能感兴趣的:(c++,算法,c语言)