C++ 在不复制的情况下分割std::字符串

C++ 在不复制的情况下分割std::字符串,c++,string,C++,String,是否可以在不复制的情况下将std::string划分为两个或多个子字符串,就像我们可以使用移动构造函数在不复制的情况下创建一个新的std::string。但是,您可以使用C++17中的std::string\u视图来实现这一点 例如: std::string str = "TheBigStr"; std::string_view p1 = std::string_view(str.data() + 3, 3); 字符串视图没有复制数据,因此在使用视图时不应修改str。我不知道您正在使用哪个编译

是否可以在不复制的情况下将
std::string
划分为两个或多个子字符串,就像我们可以使用移动构造函数在不复制的情况下创建一个新的
std::string
。但是,您可以使用C++17中的
std::string\u视图
来实现这一点

例如:

std::string str = "TheBigStr";
std::string_view p1 = std::string_view(str.data() + 3, 3);

字符串视图没有复制数据,因此在使用视图时不应修改
str

我不知道您正在使用哪个编译器,但至少Microsoft的GSL具有字符串span,它本质上是一个字符串视图

您只能移动整个字符串。也就是说,移动的是对象,如果您绝对需要避免复制,您难道不能使用迭代器/索引和长度对来记住子字符串的位置吗?或者,您可以使用堆栈分配器使复制std::basic_string对象的成本更低。@我已经编写了接受
std::string
s作为参数的函数。重写这些函数并不是世界末日,但我宁愿不重写它们。这是一个遗憾,因为我没有访问C++17编译器的权限。在接受这个答案之前,我将稍等片刻,以防有人想出一种在C++14中实现的方法。@AlessandroPower internet上有一些第三方的string\u ref/string\u view实现。我在最近的一个项目中使用过一个。您可能不需要C++17编译器。GCC的libstdc++为C++14及更高版本提供了
std::experimental::string_视图。LLVM的libc++为C++11及更高版本提供了
std::string\u视图
。您能用一个例子详细说明一下吗?