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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 19:24:04