基本用法
C++17中的string_view是一个char数据的视图或者说引用,它并不拥有该数据,是为了避免拷贝,因此使用string_view可以用来做性能优化。你应该用string_view来代替const char和const string了。string_view的方法和string类似,用法很简单:
const char* data = "test"; std::string_view str1(data, 4); std::cout<<str1.length()<<'\n'; //4 if(data==str1) std::cout<<"ok"<<'\n'; const std::string str2 = "test"; std::string_view str3(str2, str2.size());
构造string_view的时候用char*和长度来构造,这个长度可以自由确定,它表示string_view希望引用的字符串的长度。因为它只是引用其他字符串,所以它不会分配内存,不会像string那样容易产生临时变量。我们通过一个测试程序来看看string_view如何来帮我们优化性能的。
using namespace std::literals; constexpr auto s = "it is a test"sv; auto str = "it is a test"s; constexpr int LEN = 1000000; boost::timer t; for (int i = 0; i < LEN; ++i) { constexpr auto s1 = s.substr(3); } std::cout<<t.elapsed()<<'\n'; t.restart(); for (int i = 0; i < LEN; ++i) { auto s2 = str.substr(3); } std::cout<<t.elapsed()<<'\n'; //output 0.004197 0.231505
我们可以通过字面量""sv来初始化string_view. string_view的substr和string的substr相比,快了50多倍,根本原因是它不会分配内存。
string_view的生命周期
由于string_vew并不拥有锁引用的字符串,所以它也不会去关注被引用字符串的生命周期,用户在使用的时候需要注意,不要将一个临时变量给一个stringview,那样会导致string_view引用的内容也失效。
std::string_view str_v; { std::string temp = "test"; str_v = {temp}; }
这样的代码是有问题的,因为出了作用域之后,string_view引用的内容已经失效了。
文章转载自purecpp,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




