字符串拆分和排列的标准范围
std-ranges for string splitting and permutations
我正在尝试构建一个视图,该视图采用字符串向量,将这些字符串拆分为 char ;
和 returns 排列中的每行生成的标记。
int main()
{
std::vector<std::string> lines;
auto strsplit_view = std::ranges::views::split(';') | std::ranges::views::transform([](auto &&rng)
{ return std::string_view(&*rng.begin(), std::ranges::distance(rng)); });
auto filesplit_view = lines |
std::ranges::views::transform([&](auto &&line)
{ return line | strsplit_view; });
for (auto line : filesplit_view)
{
do
{
print(line);
} while (std::ranges::next_permutation(line).found)
}
}
有没有一种方法可以将排列合并到视图本身中,或者我是否必须执行如上所示的单独循环?
当前代码不适用于 lines
,在这种情况下,我需要做什么才能将 line
传递给 ranges::next_permutation
?
错误输出:
no matching function for call to ‘std::basic_string_view<char>::basic_string_view(std::ranges::transform_view<std::ranges::split_view<std::ranges::ref_view<std::__cxx11::basic_string<char> >, std::ranges::single_view<char> >, main()::<lambda(auto:18&&)> >&)’
89 | } while (std::ranges::next_permutation(std::string_view(line)).found)
首先,你应该不要将拆分的碎片转换成std::string_view
,因为它是non-modifiable,这样就无法使用next_permutation
].你应该 return std::span<char>
.
其次,filesplit_view
是一个范围,其元素是范围适配器。您需要使用for循环遍历这些范围适配器以获得实际分片。
#include <algorithm>
#include <ranges>
#include <string>
#include <vector>
int main() {
std::vector<std::string> lines;
auto strsplit_view =
std::views::split(';') | std::views::transform([](auto rng) {
return std::span(rng);
});
auto filesplit_view = lines |
std::views::transform([&](auto&& line) { return line | strsplit_view; });
for (auto adaptor : filesplit_view) {
for (auto line : adaptor) {
do {
// ...
} while (std::ranges::next_permutation(line).found);
}
}
}
我正在尝试构建一个视图,该视图采用字符串向量,将这些字符串拆分为 char ;
和 returns 排列中的每行生成的标记。
int main()
{
std::vector<std::string> lines;
auto strsplit_view = std::ranges::views::split(';') | std::ranges::views::transform([](auto &&rng)
{ return std::string_view(&*rng.begin(), std::ranges::distance(rng)); });
auto filesplit_view = lines |
std::ranges::views::transform([&](auto &&line)
{ return line | strsplit_view; });
for (auto line : filesplit_view)
{
do
{
print(line);
} while (std::ranges::next_permutation(line).found)
}
}
有没有一种方法可以将排列合并到视图本身中,或者我是否必须执行如上所示的单独循环?
当前代码不适用于 lines
,在这种情况下,我需要做什么才能将 line
传递给 ranges::next_permutation
?
错误输出:
no matching function for call to ‘std::basic_string_view<char>::basic_string_view(std::ranges::transform_view<std::ranges::split_view<std::ranges::ref_view<std::__cxx11::basic_string<char> >, std::ranges::single_view<char> >, main()::<lambda(auto:18&&)> >&)’
89 | } while (std::ranges::next_permutation(std::string_view(line)).found)
首先,你应该不要将拆分的碎片转换成std::string_view
,因为它是non-modifiable,这样就无法使用next_permutation
].你应该 return std::span<char>
.
其次,filesplit_view
是一个范围,其元素是范围适配器。您需要使用for循环遍历这些范围适配器以获得实际分片。
#include <algorithm>
#include <ranges>
#include <string>
#include <vector>
int main() {
std::vector<std::string> lines;
auto strsplit_view =
std::views::split(';') | std::views::transform([](auto rng) {
return std::span(rng);
});
auto filesplit_view = lines |
std::views::transform([&](auto&& line) { return line | strsplit_view; });
for (auto adaptor : filesplit_view) {
for (auto line : adaptor) {
do {
// ...
} while (std::ranges::next_permutation(line).found);
}
}
}