You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::ranges::find无法匹配std::string_view子范围与string_view?

问题原因与解决方法

你代码里的错误根源是用错了算法:std::ranges::find的作用是在目标范围中查找单个元素,但你传给它的第二个参数bad是std::string_view(一个字符序列范围),两者类型不匹配,编译器自然会报错提示无法调用相关操作。

要在一个字符范围里查找另一个子字符序列,你需要用std::ranges::search——这个算法专门用来判断一个子范围是否存在于目标范围中。

修正后的代码如下:

#include <vector>
#include <string_view>
#include <ranges>
#include <algorithm>

int main() {
    std::vector<std::string_view> forbidden{"123", "4fe", "bad"};
    std::string_view subject = "foo545jdsf4fesub\n55324123434\nsomebadstuff";

    for (auto&& line : subject | std::ranges::views::split('\n')) {
        bool contains_forbidden = std::ranges::any_of(forbidden, [&line](auto&& bad) {
            return std::ranges::search(line, bad).begin() != line.end();
        });
        // 可根据contains_forbidden值执行后续逻辑,比如标记违规行
    }
    return 0;
}

补充说明:std::ranges::split返回的每个line是由字符组成的视图范围,和std::string_view同属字符序列范围,std::ranges::search可以直接对二者进行子序列匹配。

内容的提问来源于stack exchange,提问作者Phoenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:02:33