如何将 int 转换为字符串然后加入 std::ranges::views?
How can I transform int to string then join with std::ranges::views?
#include <iostream>
#include <numeric>
#include <ranges>
#include <vector>
#include <string>
#include <string_view>
int main() {
auto str = (
std::views::iota(1)
| std::ranges::views::take(5)
| std::ranges::views::transform([](int x) -> std::string_view {
return std::to_string(x) + "|";
})
| std::ranges::views::join
);
for (const char ch : str) {
std::cout << ch;
}
return 0;
}
我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后加入它们并打印出来。
如果我使用 std::string
作为 return 类型的 lambda 进行转换,它会在编译时抛出很多错误。我想我应该把它改成std::string_view
。我是这样改的,它编译没有编译错误。但是,如果我在那里使用 std::string_view
,lambda 函数 returns 仅引用字符串,并且当 lambda 结束时,堆栈内存中的翻译字符串将在内存中删除。所以,程序不打印任何东西。
我该如何解决?
If I use std::string
for return type of lambda for transform, it
throws many error on compile time.
您观察到的 C++20 缺陷已被 P2328. If you use a newer compiler version that has already implemented P2328 (such as gcc-11.2), your code will be well-formed 解决。
在P2328之前,我觉得标准里有no simple solution
#include <iostream>
#include <numeric>
#include <ranges>
#include <vector>
#include <string>
#include <string_view>
int main() {
auto str = (
std::views::iota(1)
| std::ranges::views::take(5)
| std::ranges::views::transform([](int x) -> std::string_view {
return std::to_string(x) + "|";
})
| std::ranges::views::join
);
for (const char ch : str) {
std::cout << ch;
}
return 0;
}
我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后加入它们并打印出来。
如果我使用 std::string
作为 return 类型的 lambda 进行转换,它会在编译时抛出很多错误。我想我应该把它改成std::string_view
。我是这样改的,它编译没有编译错误。但是,如果我在那里使用 std::string_view
,lambda 函数 returns 仅引用字符串,并且当 lambda 结束时,堆栈内存中的翻译字符串将在内存中删除。所以,程序不打印任何东西。
我该如何解决?
If I use
std::string
for return type of lambda for transform, it throws many error on compile time.
您观察到的 C++20 缺陷已被 P2328. If you use a newer compiler version that has already implemented P2328 (such as gcc-11.2), your code will be well-formed 解决。
在P2328之前,我觉得标准里有no simple solution