如何将 std::string 拆分为 std::string_views 的范围 (v3)?
How to split a std::string into a range (v3) of std::string_views?
我需要在所有空格处拆分一个 std::string
。然而,结果范围应该将它的元素转换为 std::string_view
s。我正在为范围的 "element type" 苦苦挣扎。我猜,类型类似于 c_str
。如何将 "split" 部分转换为 string_view
s?
#include <string>
#include <string_view>
#include "range/v3/all.hpp"
int main()
{
std::string s = "this should be split into string_views";
auto view = s
| ranges::view::split(' ')
| ranges::view::transform(std::string_view);
}
(其中一个)这里的问题是 ranges::view::split
returns 一个范围 of ranges, 你不能直接构造一个 std::string_view
来自一个范围。
你想要这样的东西:
auto view = s
| ranges::views::split(' ')
| ranges::views::transform([](auto &&rng) {
return std::string_view(&*rng.begin(), ranges::distance(rng));
});
可能有 better/easier 方法可以做到这一点,但是:
&*rng.begin()
会给你原始字符串. 中块的第一个字符的地址
ranges::distance(rng)
会给你这个块中的字符数。请注意,这比 ranges::size
慢,但这里是必需的,因为我们无法在恒定时间内检索 rng
的大小。
我需要在所有空格处拆分一个 std::string
。然而,结果范围应该将它的元素转换为 std::string_view
s。我正在为范围的 "element type" 苦苦挣扎。我猜,类型类似于 c_str
。如何将 "split" 部分转换为 string_view
s?
#include <string>
#include <string_view>
#include "range/v3/all.hpp"
int main()
{
std::string s = "this should be split into string_views";
auto view = s
| ranges::view::split(' ')
| ranges::view::transform(std::string_view);
}
(其中一个)这里的问题是 ranges::view::split
returns 一个范围 of ranges, 你不能直接构造一个 std::string_view
来自一个范围。
你想要这样的东西:
auto view = s
| ranges::views::split(' ')
| ranges::views::transform([](auto &&rng) {
return std::string_view(&*rng.begin(), ranges::distance(rng));
});
可能有 better/easier 方法可以做到这一点,但是:
&*rng.begin()
会给你原始字符串. 中块的第一个字符的地址
ranges::distance(rng)
会给你这个块中的字符数。请注意,这比ranges::size
慢,但这里是必需的,因为我们无法在恒定时间内检索rng
的大小。