C语言中如何实现字符串视图的长尾查询功能?

2026-04-10 09:011阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1512个文字,预计阅读时间需要7分钟。

C语言中如何实现字符串视图的长尾查询功能?

C++ 中字符串视图简介:当谈到 C++ 中的字符串视图时,我们通常指的是基于字符类型 char 的 std::basic_string_view 特化版本。字符串视图是指向字符串的非拥有引用,它代表了一系列字符的视图。

C语言中如何实现字符串视图的长尾查询功能?

C++ 23 String Views

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

从高层次来看,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<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_prefixremove_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; }

本文共计1512个文字,预计阅读时间需要7分钟。

C语言中如何实现字符串视图的长尾查询功能?

C++ 中字符串视图简介:当谈到 C++ 中的字符串视图时,我们通常指的是基于字符类型 char 的 std::basic_string_view 特化版本。字符串视图是指向字符串的非拥有引用,它代表了一系列字符的视图。

C语言中如何实现字符串视图的长尾查询功能?

C++ 23 String Views

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

从高层次来看,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<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_prefixremove_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; }