为何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
相关产品推荐
相关产品推荐

