标签: range-v3

使用 range-v3 连接不同类型

我想知道是否可以连接两个包含不同类型对象的向量,以便我可以迭代连接并调用通用接口。

像这样的东西:

    std::vector<A> as;
    as.resize(3);

    std::vector<B> bs;
    bs.resize(4);

    for (const auto &v : ranges::views::concat(as, bs))
    {
        foo(v);
    }
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到完整的示例 https://godbolt.org/z/nr5hhWMxj

c++ range-v3

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

`closed_iota` 和 `iota` 之间的区别?

closed_iotaiota, 来自 range-v3 库有什么区别?

c++ range-v3

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

如何在 lambda 中检索连接范围的索引?

我有以下代码:

#include <range/v3/all.hpp>
#include <deque>
#include <iostream>

auto main() -> int
{
    using namespace ranges;
    namespace views = ranges::views;

    auto v1 = std::deque<double>({ 123.080, 123.110, 123.105, 123.090, 123.095 });
    auto v2 = std::deque<double>({ 123.100, 123.120, 123.115, 123.070, 123.105 });

    auto vc = ranges::views::concat(v1, v2); 
    
    auto lambda = [&](auto& elem){
        const auto index = &elem - &vc[0];
        if (index == 0 || index + 1 > vc.size()) return false;
        if ((vc[index - 1] > vc[index] && vc[index] < vc[index + 1]) …
Run Code Online (Sandbox Code Playgroud)

c++ range-v3 c++20

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

rangev3 ts中"范围"和"视图"之间的区别是什么?

rangev3 ts中"范围"和"视图"之间的区别是什么?

在G搜索上找不到任何类似的答案.猜猜我正在努力解决每个人应该做的事情:

是这样的(在c ++中说)范围'是'a'视图,反之亦然?

它只是一个视图是只读范围吗?或者也许是范围中的"元素"(当你取消引用迭代器时得到的)是const而不是另一个?

谢谢!

c++ range-v3

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

了解 range-v3 中的 zip 如何工作

我试图了解 range::views::zip 在 range-v3 中如何工作。据我所知,它是一个范围,允许通过创建不同范围中的元素元组来在一个循环中迭代多个范围。

\n\n
std::vector<int> v1 = {0, 1, 2};\nstd::vector<char> v2 = {'a', 'b', 'c'};\n\n\nauto zip = ranges::views::zip(v1,v2);\n// zip(v1,v2) = [(0,a), (1,b), (2,c)]\n\nranges::actions::sort(zip);\nstd::sort(std::begin(zip), std::end(zip));\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用排序ranges::actions工作正常,但std::sort无法编译并给出以下错误

\n\n
/usr/include/c++/9.3.0/bits/stl_algobase.h:151: error: no matching function for call to \xe2\x80\x98swap(concepts::return_t<ranges::common_pair<int&, double&>, void>, concepts::return_t<ranges::common_pair<int&, double&>, void>)\xe2\x80\x99\n  151 |       swap(*__a, *__b);\n      |       ~~~~^~~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么会发生这种情况?

\n\n

我还尝试同时删除两个容器中的元素。ranges::actions::unique无法编译并出现以下错误:

\n\n
/home/jjcasmar/projects/cpfsofaplugin/src/CPFSofaPlugin/minimalExample.cpp:27: error: no match for call to \xe2\x80\x98(const ranges::actions::action_closure<ranges::actions::unique_fn>) (ranges::zip_view<ranges::ref_view<std::vector<int, std::allocator<int> > >, ranges::ref_view<std::vector<double, std::allocator<double> > > >&)\xe2\x80\x99\n   27 | …
Run Code Online (Sandbox Code Playgroud)

c++ iterator range-v3

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

为什么即使迭代器是 std::move_iterator,ranges-v3 也不移动元素?

#include <range/v3/all.hpp>
#include <vector>
#include <string>
#include <deque>

using namespace std::literals;

int main()
{
    auto src         = std::vector{"123"s, "456"s, "789"s};
    auto movable_rng = ranges::subrange(
                           std::make_move_iterator(src.begin()), 
                           std::make_move_iterator(src.end()));

    auto dst = ranges::to<std::deque<std::string>>(movable_rng);

    for (auto e : src)
    {
        std::cout << e << std::endl;
    }

    for (auto e : dst)
    {
        std::cout << e << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

用 libc++ 用 clang 10 编译,输出为:

123
456
789
123
456
789
Run Code Online (Sandbox Code Playgroud)

正如我所料,结果应该是:

""
""
""
123
456
789
Run Code Online (Sandbox Code Playgroud)

为什么即使是迭代器,ranges-v3 也不移动元素 std::move_iterator

========更新======

我的范围版本是: …

c++ standards rvalue-reference move-semantics range-v3

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

在检查两个字符串是否不区分大小写相等时,变换视图而不是投影仪会降低 C 风格方法的性能

太长了;博士

\n

在检查两个字符串是否不区分大小写相等时,为什么这段代码

\n
bool rangeV3WithTransformViews(std::string_view str1, std::string_view str2) {\n    return equal(str1 | transform(tolowercase),\n                 str2 | transform(tolowercase));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

比这个慢很多吗?

\n
bool rangeV3WithProj(std::string_view str1, std::string_view str2) {\n    return equal(str1, str2, std::equal_to{}, tolowercase, tolowercase);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

从后面的代码中,GCC 13.2-O3设法生成与低级 C 风格解决方案相同的汇编代码:

\n
#define to_lower_ascii(c) (((c) >= \'A\' && (c) <= \'Z\') ? (c) + 32 : (c))\n\nint cstyle(const char* str1, const char* str2) {\n    while (*str1 != \'\\0\' && *str2 != \'\\0\' && to_lower_ascii(*str1) == to_lower_ascii(*str2)) {\n        str1++;\n        str2++;\n    }\n    return to_lower_ascii(*str1) …
Run Code Online (Sandbox Code Playgroud)

c++ performance benchmarking range-v3 c++20

-3
推荐指数
1
解决办法
151
查看次数