std::vector我在尝试用 C++ 中的结果填充 a 时遇到问题std::views::split。具体来说,我可以成功地std::string从 的项构造 a std::ranges::split_view(如下面代码的第一个循环所示),但在尝试使用迭代器std::vector直接创建 a 时遇到困难。
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::string rg{ "1, 2, 3, 1, 2, 3, 4, 5, 6 "};
// Successful construction of std::string from std::ranges::split_view
for (const auto& subrange : rg | std::views::split('3'))
{
std::string value(subrange.begin(), subrange.end());
std::cout << value << '\n';
}
// Issue arises here when attempting to create std::vector
auto parts …Run Code Online (Sandbox Code Playgroud) 使用 C++23 视图::join_with 时可以使用多字符串作为分隔符吗?
gcc 14 返回错误消息。
#include <format>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <ranges>
using namespace std;
int main(){
const string a[2]={"6", "7"};
const string buffer1 = a | views::join_with('\n') | ranges::to<string>(); //OK
printf("%s", buffer1.c_str());
const string buffer2 = a | views::join_with(",\n") | ranges::to<string>(); //KO
printf("%s", buffer2.c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
prog.cc: In function 'int main()':
prog.cc:13:30: error: no match for 'operator|' (operand types are 'const std::string [2]' {aka 'const std::__cxx11::basic_string<char> [2]'} and 'std::ranges::views::__adaptor::_Partial<std::ranges::views::_JoinWith, const char*>')
13 | …Run Code Online (Sandbox Code Playgroud) 我有以下代码,它可以工作,但是 C++20 版本看起来并不比 C++17 版本好多少。我的猜测问题是multimap equal_range返回 apair并且范围无法确定这是一对有效的迭代器。
有没有办法用更短更好的方式来写这个?
#include <iostream>
#include <map>
#include <ranges>
int main() {
std::multimap<bool,int> oddness{{false,2}, {true,3}, {true,47}, {false,74656}};
// nice, does not work:
// oddness.equal_range(true) | std::views::values;
// works:
oddness | std::views::values;
// working code:
auto odds = oddness.equal_range(true);
const auto odds_view = std::views::values(std::ranges::subrange(odds.first, odds.second));
for (const auto& odd : odds_view) {
std::cout << odd << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud) #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;
}
Run Code Online (Sandbox Code Playgroud)
我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后连接它们并打印它。
如果我使用std::stringlambda 的返回类型进行转换,它会在编译时引发许多错误。我想我应该把它改成std::string_view. 我这样改了,编译没有编译错误。但是,如果我std::string_view在那里使用,lambda 函数仅返回字符串的引用,并且当 lambda 结束时,堆栈内存上的翻译字符串将被从内存中删除。因此,该程序不会打印任何内容。
我该如何修复它?
左关联性已由 C++ 核心语义保证:
R|V1|V2被解析为(R|V1)|V2). 如果编码员想要显式地将操作顺序更改为 ,该怎么办R|(V1|V2)?这在 C++23 下可能吗?这个问题背后的原因是它简化了自定义范围适配器的定义:
auto myV=V1|V2|V3;
for(auto& x:R1|myV)/*..*/;
for(auto& x:R2|myV)/*..*/;
Run Code Online (Sandbox Code Playgroud)
所有这些需求似乎都是对 ; 的适当约束过载std::views::operator|;这种超载是否存在?如果没有的话会添加吗?如果不是,其背后的理由是什么?
我正在努力满足我的班级的 C++20 概念。
struct C1
{
int* begin();
int* end();
};
static_assert(std::ranges::range<C1>); // Compiles fine
struct C2 {};
namespace std::ranges // (A)
{
auto begin(C2&);
auto end(C2&);
}
static_assert(std::ranges::range<C2>); // Fails to compile
Run Code Online (Sandbox Code Playgroud)
该std::ranges::range<>概念定义如下:
template <class _Rng>
concept range = requires(_Rng& __r) {
std::ranges::begin(__r);
std::ranges::end(__r);
};
Run Code Online (Sandbox Code Playgroud)
从字面意思上看,它指示我声明上面的函数 (A)。但这些都没有帮助。另一方面,像在类中一样定义两个成员函数C1 确实有效。我的问题是,我只是看不到概念所强加的要求与有助于 class 的解决方案之间的语义联系C1。它告诉我做一件事,而实际上我需要做另一件事。
请对此提供一些解释。
背景:在我的生产代码中,我的类确实定义了一个begin()和end()函数,每个函数返回一个迭代器。但这个range概念并不满足这些定义,也未能告诉我原因。
请参阅编译器资源管理器上的完整示例