如何结合std::views::split与std::ranges::count统计拆分后的匹配元素?
问题原因
std::views::split返回的是由子范围构成的范围,每个元素都是对应拆分片段的字符子range,而非std::string类型。std::ranges::count要求被统计元素与第二个参数的类型能直接用==比较,但子range和std::string之间没有默认的相等比较逻辑,因此编译器找不到匹配的调用运算符,报出C3889错误。另外你代码里的std::range::count是笔误,正确写法是std::ranges::count。
解决方案
无需将拆分结果存入容器,直接用std::ranges::count_if配合std::ranges::equal实现统计:
#include <string> #include <ranges> #include <algorithm> std::string setting; std::string extension; const auto count = std::ranges::count_if( setting | std::views::split(' '), [&extension](const auto& subrange) { // 直接比较子range的字符序列与extension是否完全一致 return std::ranges::equal(subrange, extension); } );
说明
std::ranges::count_if会遍历拆分后的每个子range,通过传入的谓词判断是否匹配std::ranges::equal可以直接比较两个字符范围的内容是否完全相同,不需要将子range转换为std::string- 整个过程基于视图的延迟计算,不会额外分配内存存储拆分后的片段
内容的提问来源于stack exchange,提问作者Holt
相关产品推荐
相关产品推荐

