【问题标题】:Using range::find on a view在视图上使用 range::find
【发布时间】:2022-12-19 14:35:56
【问题描述】:

我想批准以下代码,该代码检查是否首次出现了一系列唯一字符:

bool hasOnlyUniqueElements( auto& data ) {
    std::unordered_set<char> set;

    for( auto& value : data )
        set.emplace( value );

    return set.size() == data.size();
}

int64_t getStartPacketMarker( const std::string& data, int64_t markerSize ) {
    for( int64_t i = 0; i < data.size() - markerSize; i++ )
    {
        std::string_view packet( data.begin() + i, data.begin() + i + markerSize );
        if( hasOnlyUniqueElements( packet ) )
            return i + markerSize;
    }
    return -1;
}

我想出了以下,它使用范围但只是稍微好一点:

int64_t getStartPacketMarker( const std::string& data, int64_t markerSize ) {
    int64_t idx = 0;
    for( auto packet :  data | ranges::views::sliding( markerSize ) ) {
        if( hasOnlyUniqueElements( packet ) )
            return idx + markerSize;
        idx++;
    }

    return -1;
}

这应该是一个简单的查找操作,但我无法使其工作,也找不到在视图上使用查找的任何示例。是否可以在视图上使用查找?

【问题讨论】:

    标签: c++ range-v3


    【解决方案1】:

    是的,您可以在视图中使用find。但是,在您的情况下,您应该使用 find_if 因为您正在检查谓词函数:

    auto view = data | std::views::slide(markerSize);
    auto it = std::ranges::find_if(
                  view, somePredicate
              );
    return it == view.end() ? -1 : it - view.begin();
    

    但是,由于您的谓词函数具有 auto-deduced 参数,因此您无法直接获取它的函数指针,而需要将其包装在 lambda 中:

    auto view = data | std::views::slide(markerSize);
    auto it = std::ranges::find_if(
                  view, [](const auto& v) { return hasOnlyUniqueElements(v); }
              );
    return it == view.end() ? -1 : it - view.begin();
    

    【讨论】:

    • @Grimkin 我不太熟悉 range-v3,但我认为它应该适用于两者。
    • 我现在尝试了它并且它适用于两者。我的错误是信任 MSVC 中的 Intellisense,它显示了一个错误,我没有尝试编译它。谢谢您的帮助
    【解决方案2】:

    除了在范围内使用 std::ranges::find_if 之外,您还可以使用 std::unique 跳过在 hasOnlyUniqueElements 中构建集合的“for”循环:

    set = data | std::ranges::unique

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2021-07-13
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多