C++中如何按'/'分割字符串并将各级路径前缀存入unordered_set
原有代码问题分析
你当前的代码直接以/作为std::getline的分隔符读取文件,只会拆分出所有单个路径片段,无法拼接出完整的层级前缀,同时会把行尾换行符、输入自带的引号等无效字符混入读取结果,无法得到预期输出。
调整后的基础实现方案
该方案兼容性强,不需要依赖高版本C++特性即可运行:
#include <fstream> #include <string> #include <unordered_set> std::unordered_set<std::string> unoset; std::string instances_file { "/home/areg/Desktop/instance_file.txt" }; const char delimiter {'/'}; std::ifstream ifs (instances_file); if (!ifs.is_open()) { // 可自行补充文件打开失败的异常处理逻辑 return; } std::string line; // 先逐行读取完整路径 while(std::getline(ifs, line)) { // 过滤输入行首尾的双引号(匹配你给出的输入格式) if (line.size() >= 2 && line.front() == '"' && line.back() == '"') { line = line.substr(1, line.size() - 2); } if (line.empty()) continue; std::string current_prefix; size_t pos = 0; size_t prev = 0; // 遍历分隔符拼接各级前缀插入集合 while ((pos = line.find(delimiter, prev)) != std::string::npos) { current_prefix += line.substr(prev, pos - prev); unoset.insert(current_prefix); current_prefix += delimiter; prev = pos + 1; } // 插入最后一级完整路径 current_prefix += line.substr(prev); unoset.insert(current_prefix); }
基于STL算法的实现方案
如果使用C++20及以上版本,可以配合STL范围库和算法实现更简洁的写法:
#include <fstream> #include <string> #include <unordered_set> #include <ranges> #include <numeric> std::unordered_set<std::string> unoset; std::string instances_file { "/home/areg/Desktop/instance_file.txt" }; const char delimiter {'/'}; std::ifstream ifs (instances_file); if (!ifs.is_open()) { return; } std::string line; while(std::getline(ifs, line)) { if (line.size() >= 2 && line.front() == '"' && line.back() == '"') { line = line.substr(1, line.size() - 2); } if (line.empty()) continue; // 拆分路径为段视图,用accumulate累加拼接前缀 auto segments = line | std::views::split(delimiter); std::string prefix; std::accumulate(segments.begin(), segments.end(), std::ref(prefix), [&unoset, delimiter](std::string& p, const auto& seg) { if (!p.empty()) p += delimiter; p.append(seg.begin(), seg.end()); unoset.insert(p); return std::ref(p); }); }
内容的提问来源于stack exchange,提问作者Areg Abgaryan
相关产品推荐
相关产品推荐

