前言:
在C++中处理字符串的基本工具是标准字符串 std::string,但构造一个std: :string成本较高,因为它必须完全持有字符串的内容,极端的时候会有很高的内存拷贝代价,影响程序效率。使用const std: :string&可以避免一些问题,但它在处理c字符串、提取子串时却又无能为力。总而言之,std: :string 显得有些“重”,我们需要一种更“轻”的字符串工具。
boost.string_ref就是这样一种轻量级的字符串,顾名思义,它只持有字符串的引用,没有内存拷贝成本,所以运行效率很高,是更好的 const std: : string&。它已经被收入C++17标准(但更名为string_view)。
string_ref库位于名字空间 boost,需要包含头文件<boost/utility/string_ref.hpp>,即;
#include <boost/utility/string_ref.hpp>
using namespace boost;
basic_string_ref的工作原理很简单,它不拷贝字符串,所以也就不分配内存,只用两个成员变量ptr_和 len_标记字符串的起始位置和长度,这样就实现了字符串的表示。
基于ptr_和 len_, basic_string_ref实现了与std: : string 基本一致的接口,例如获取大小、获取字符、取字串、迭代器和比较等等。但需要注意,basic_string_ref是一个字符串的“常量视图”,大部分成员函数都是const修饰的,我们只能像const std: :string&那样去观察字符串而无法修改字符串,理解这一点非常重要。
函数用法
#include<boost/utility/string_ref.hpp>
#include<string>
#include<iostream>
#include<assert.h>
using namespace boost;
void simple()
{
const char* ch="Day of Future Past";
std::string str(ch);//拷贝成本
string_ref s1(ch);
string_ref s2(str);
assert(s1==s2&&s1==ch&&s2==str);
string_ref s3(ch,4);
assert(s3==str.substr(0,4));
// 相当于 string
// 不做过多展示
const char* ch1="Apple iphone ipad";
string_ref str1(ch1);
for(auto& x: str1)
{
std::cout<<x<<std::endl;
}
}
int main()
{
simple();
}
虽然string_ref不能直接改变原字符串,但它可以使用remove_prefix ()和remove_suffix ()这两个函数调整string_ref内部的字符串指针和长度,达到变动字符串引用的目的——但原始字符串仍然没有被修改:
由于 string_ref 的接口与 string 完全相同,所以它的一个重要用途是代替 conststd: :string&类型作为函数参数或者返回值,可以完全避免字符串拷贝代价,提高字符串的处理效率。
const char* ch1="Apple iphone ipad";
string_ref str(ch1);
str.remove_prefix(6);
std::cout<<str<<std::endl;
str.remove_suffix(5);
std::cout<<str<<std::endl;
auto trunk=[](string_ref str)->string_ref
{
return str.substr(0,5);
};
std::cout<<trunk("abcdfe")<<std::endl;
//
iphone ipad
iphone
abcdf
使用string_ref还需要加一点小心,因为它持有的是弱引用,必须保证被引用的字符串对象可用,尽量避免长期持有或者延后使用。在确实需要持有或者修改字符串的时候可以调用成员函数to_string()获得一个拷贝来保证安全。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129672.html