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

如何从字符串类型的二维vector生成所有token组合?

解决方案:生成字符串集合的笛卡尔积并拼接

你需要实现的是多个字符串集合的笛卡尔积,每个组合用|连接成字符串,结果总数等于所有子vector大小的乘积,同时支持动态扩展子vector。以下是具体实现方式和相关说明:

1. 从头生成完整结果

迭代式实现是最高效的方式,避免递归栈溢出,适合处理较大的数据集:

#include <vector>
#include <string>

std::vector<std::string> generateCartesianProduct(const std::vector<std::vector<std::string>>& vecTokens) {
    std::vector<std::string> results;
    if (vecTokens.empty()) return results;

    // 初始化第一个子集合的元素
    for (const auto& token : vecTokens[0]) {
        results.push_back(token);
    }

    // 依次合并后续每个子集合
    for (size_t i = 1; i < vecTokens.size(); ++i) {
        const auto& currentTokens = vecTokens[i];
        std::vector<std::string> temp;
        // 遍历现有结果,与当前子集合的每个元素拼接
        for (const auto& existing : results) {
            for (const auto& token : currentTokens) {
                temp.push_back(existing + "|" + token);
            }
        }
        results.swap(temp); // 用swap减少内存拷贝开销
    }

    return results;
}

2. 增量扩展已有结果

如果已经生成了部分结果,新增子vector时无需从头重建,直接对现有结果做扩展:

void extendCartesianProduct(std::vector<std::string>& existingResults, const std::vector<std::string>& newTokens) {
    if (existingResults.empty()) {
        existingResults = newTokens;
        return;
    }
    std::vector<std::string> temp;
    for (const auto& existing : existingResults) {
        for (const auto& token : newTokens) {
            temp.push_back(existing + "|" + token);
        }
    }
    existingResults.swap(temp);
}

3. 递归实现(适合理解逻辑)

如果数据集不大,递归方式更直观,容易理解笛卡尔积的生成逻辑:

#include <vector>
#include <string>

void buildCartesian(const std::vector<std::vector<std::string>>& vecTokens, size_t currentIndex, std::string currentStr, std::vector<std::string>& results) {
    if (currentIndex == vecTokens.size()) {
        results.push_back(currentStr);
        return;
    }
    for (const auto& token : vecTokens[currentIndex]) {
        std::string nextStr = currentStr.empty() ? token : currentStr + "|" + token;
        buildCartesian(vecTokens, currentIndex + 1, nextStr, results);
    }
}

std::vector<std::string> generateCartesianProductRecursive(const std::vector<std::vector<std::string>>& vecTokens) {
    std::vector<std::string> results;
    buildCartesian(vecTokens, 0, "", results);
    return results;
}

关于标准算法

C++标准库中没有直接提供生成笛卡尔积的算法,但这是集合论中的基础操作,核心逻辑就是嵌套遍历多个集合,将元素组合起来。你可以根据自己的需求选择迭代或递归实现,迭代方式在处理大数据量时更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:22:52