标签: std-ranges

在 C++ 中使用 std::views::split 填充 std::vector 存在困难

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++ split c++20 std-ranges

1
推荐指数
1
解决办法
126
查看次数

使用多字符分隔符的 C++ 视图 join_with

使用 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++ std-ranges c++23

1
推荐指数
1
解决办法
52
查看次数

std::multimap 等于 _range 和 C++20 std::views::values 不能很好地协同工作

我有以下代码,它可以工作,但是 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)

c++ c++20 std-ranges

0
推荐指数
1
解决办法
86
查看次数

如何将 int 转换为 string 然后与 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;
}
Run Code Online (Sandbox Code Playgroud)

我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后连接它们并打印它。

如果我使用std::stringlambda 的返回类型进行转换,它会在编译时引发许多错误。我想我应该把它改成std::string_view. 我这样改了,编译没有编译错误。但是,如果我std::string_view在那里使用,lambda 函数仅返回字符串的引用,并且当 lambda 结束时,堆栈内存上的翻译字符串将被从内存中删除。因此,该程序不会打印任何内容。

我该如何修复它?

c++ c++20 std-ranges

0
推荐指数
1
解决办法
852
查看次数

`std::views` 的右关联性

左关联性已由 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++ std-ranges c++23

0
推荐指数
1
解决办法
92
查看次数

为什么 C++20 范围概念指定了明显误导性的要求?

我正在努力满足我的班级的 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概念并不满足这些定义,也未能告诉我原因。

请参阅编译器资源管理器上的完整示例

c++ c++-concepts c++20 std-ranges

0
推荐指数
1
解决办法
221
查看次数

标签 统计

c++ ×6

std-ranges ×6

c++20 ×4

c++23 ×2

c++-concepts ×1

split ×1