如何返回 std::string 的常量视图?
Posted
技术标签:
【中文标题】如何返回 std::string 的常量视图?【英文标题】:How to return a constant view of a std::string? 【发布时间】:2017-01-17 00:26:36 【问题描述】:在使用 C++ 进行原型设计和玩耍时,尝试一些概念来制作可识别 utf8 的不可变字符串,但我遇到了以下两难境地:
有什么方法可以返回一个字符串的不可变视图。就像,我希望能够返回一个引用原始字符串一部分的子字符串,而不是返回一个子字符串。
// Just some quick prototyping of ideas.
// Heavier than just a normal string.
// Construction would be heavier too because of the indices vector.
// Size would end up being O1 though.
// Indexing would also be faster.
struct ustring
std::string data;
std::vector<size_t> indices;
// How do I return a view to a string?
std::string operator [](size_t const i) const
return data.substr(indices[i], indices[i + 1] - indices[i]);
;
【问题讨论】:
你有 c++17 中的string_view
类吗?
另外,一些库在 c++14 中实现了<experimental/string_view>
,在此之前,boost 有一个 string_view 库。您也可以使用 GSL。
【参考方案1】:
听起来std::string_view
是适合你的课程!如果您没有 C++17 支持,请尝试 std::experimental::string_view
。如果这不可用,请尝试boost::string_view
。所有这些选项都可以以相同的方式使用(只需将 std::string_view
替换为您使用的任何内容):
std::string_view operator [](size_t const i) const
return std::string_view(&data[i], 1);
欢迎使用 C++,总有另一个厨房水槽!
【讨论】:
在 Visual Studio 2017 中,标题确实出现在智能感知中,但是,当我执行std::
时,没有 string_view
或 experimental::string_view
可用。也许他们只是保留了这个词以备将来使用?
您是#include <string_view>
还是#include <experimental/string_view>
?
#include #include
或尝试使用std::string_view
时编译是否失败? (我在这里掌握了一点——我并没有真正使用 Visual Studio 或 MSVC)
让我们continue this discussion in chat。以上是关于如何返回 std::string 的常量视图?的主要内容,如果未能解决你的问题,请参考以下文章
C++ std::string::npos常量(值为-1)(表示“直到字符串的结尾”,作为返回值,它通常用于表示不匹配)
为什么std :: runtime_error的c'tor采用对std :: string的常量引用?
为啥这个 std::string_view 不是常量表达式?