【问题标题】:How to get original string by string_view in c++?如何在 C++ 中通过 string_view 获取原始字符串?
【发布时间】:2021-12-28 14:25:31
【问题描述】:

例如,

std::string_view strv{ "Hello" };
strv.remove_prefix(1);

原始字符串应该是“Hello”。
我尝试使用 strv.data()std::string str(strv.begin(), strv.end());
我只能得到“hello”而不是“Hello”。

【问题讨论】:

  • 你删除了strv.remove_prefix(1)的第一个字符(h),为什么你会期待“ello”以外的任何东西?
  • data() 成员返回指向视图第一个元素的指针,而不是原始字符串的第一个元素。迭代器也是如此。原因是视图就像在实际容器上打开的窗口,而不是容器本身。
  • strv.data() - 1?但它现在不在视野范围内......
  • 有谁知道访问strv.data() - 1是否是未定义的行为?
  • @JohnFilleau 应该没问题,因为data 指向一个数组,指向data() - 1 仍在同一个数组中的位置。 AFAIK 指针算术规则说没关系。

标签: c++ string string-view


【解决方案1】:

我现在只找到了两种方法。

  1. 使用变量(例如string str)来存储原始字符串,然后使用使用string_view。当您需要原始字符串时,请使用str

  2. 使用变量(例如int removed_len)来记录移除前缀的长度。那么当你需要原字符串的时候strv.data() - removed_len就是原字符串的起始位置。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

您用来构造strv"Hello" 是您的原始字符串。但是,您从未真正实例化该字符串,使其成为纯右值。如果您想保留原始字符串的副本,请尝试以下操作:

std::string str{"Hello"};
std::string_view strv{str};
strv.remove_prefix(1);

str 将保存您的原始字符串。

【讨论】:

  • 是否可以找到原始匿名字符串?
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多