问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++新特性详解:string_view字符串视图

创作时间:
作者:
@小白创作中心

C++新特性详解:string_view字符串视图

引用
1
来源
1.
https://m.jiaoyubao.cn/news/n150911.html

C++17引入的string_view特性,为字符串处理提供了更高效的方式。它是一个轻量级、非拥有、只读的字符串查看器,可以避免不必要的字符串复制和内存分配,从而提高程序性能。本文将详细介绍string_view的特性和使用场景。

string_view简介

std::string_view是C++17引入的一个字符串视图类。它是一个轻量级、非拥有、只读的字符串查看器,可以用于以只读方式访问字符串的连续字符序列,而无需复制字符串数据。与Python中的字符串对象类似,但改革得没有Python彻底,毕竟还需要构造转换而非编译层面支持。

string_view的主要特性

  • 非拥有性:std::string_view不拥有字符串数据,它仅仅是对现有字符串的引用或视图。这意味着它不负责管理字符串的生命周期,需要确保字符串数据的生存期足够长,防止出现空悬指针的风险。

  • 只读性:std::string_view是只读的,不能修改其所引用的字符串内容。这使得它适用于需要读取字符串内容但不需要修改的场景。

  • 轻量级:std::string_view对象本身非常轻量,通常只包含指向字符串数据的指针和长度信息,因此创建、传递和复制的开销很小。

string_view的常见用法

std::string_view可以作为函数参数,允许函数在不复制字符串的情况下处理字符串数据;它还可以用于在算法中查找、比较字符串片段等操作;另外,它还可以用于提取子字符串或字符串片段。

与std::string相比,string_view在处理子字符串时更加高效。std::string提供了一个返回字符串子串的函数,但是每次返回的都是一个新的对象,也需要进行构造。而string_view则不会,对于它而言仅仅是对通过指针偏移和长度收缩构造一个新的string_view,不涉及内存的重新分配和数据拷贝。

示例代码

#include <iostream>
#include <string_view>

void PrintStringView(std::string_view sv) {
    std::cout << "String View: " << sv << std::endl;
}

int main() {
    std::string str = "Hello, World!";
    std::string_view sv(str);
    PrintStringView(sv); // 使用 string_view 进行子字符串的提取

    std::string_view substr = sv.substr(7, 5); // 从第7个字符开始提取长度为5的子字符串
    std::cout << "Substring: " << substr << std::endl;

    return 0;
}

在这个例子中,std::string_view被用作函数PrintStringView的参数,允许函数以只读方式访问字符串数据。另外,通过substr方法可以提取原始字符串的子字符串。

string_view的创建

string_view提供了多个构造函数来创建字符串视图对象:

  • 默认构造函数:默认构造函数创建一个空的string_view对象,它不包含任何字符。

  • 从C风格字符串构造:可以使用指向以空字符结尾的C风格字符串(const char*)或指针和长度(const char*, size_t)来创建string_view对象。

  • 从STL字符串构造:可以使用std::string对象或其它STL字符串类型(如std::string_view)来构造string_view对象。

  • 从字符串字面量构造:可以使用字符串字面量来创建string_view对象,字符串字面量的类型为const char[]。

  • 拷贝构造函数:string_view提供了一个拷贝构造函数,它可以从另一个string_view对象创建新的对象。

需要注意的是,string_view本身不拥有任何字符串数据,它只是一个对字符串数据的引用。因此,在使用string_view时需要确保所引用的字符串对象在其有效范围内。另外,由于string_view不拥有字符串数据,因此不能修改其所引用的字符串。

函数形参的选择

在函数形参的选择上,使用string_view相比const string&在某些场景下可以避免临时对象的创建。例如:

void func(const std::string& s) {
    std::cout << s << "\n";
}

std::string s{"乐呵"};
func("乐呵");
func(s);

在调用func("乐呵")时,字符串字面量会先隐式转换到指针,然后调用std::string的转换构造函数,构造出一个临时的std::string对象。而使用string_view则不会产生这样的临时对象,虽然string_view自身也是一个临时对象,但其创建代价要低得多。

总结

std::string_view是C++17引入的一个非拥有的字符串视图类型,它提供了一种轻量级的方式来访问现有字符串数据。通过避免字符串复制和内存分配,它可以显著提高程序性能,并提供方便的字符串处理能力。但是,在使用过程中需要注意正确管理原始字符串的生命周期,以确保使用的字符串数据有效和安全。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号