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

如何实现R语言split()函数功能对应的等效C++代码

R语言split()函数的C++等效实现

R中split(x, f)的核心功能是:按照分组因子f的标签,将输入向量x中标签相同的元素归集到同一组中。你示例中gl(2, 3)生成分组标签序列为[1,1,1,2,2,2,1,1,1,2,2,2],最终得到两组元素。

基础实现(通用版,适配任意分组)

适合所有split场景,代码逻辑简单易懂,适合C++入门学习:

#include <iostream>
#include <vector>
#include <unordered_map>

// 等效R split函数的通用实现
// 参数input:待拆分的原始向量
// 参数groups:和input长度一致的分组标签向量
// 返回值:键为分组标签、值为对应组元素的映射
std::unordered_map<int, std::vector<int>> split(const std::vector<int>& input, const std::vector<int>& groups) {
    std::unordered_map<int, std::vector<int>> result;
    // 逐个遍历元素,按分组标签存入对应向量
    for (int i = 0; i < input.size(); ++i) {
        int current_group = groups[i];
        result[current_group].push_back(input[i]);
    }
    return result;
}

// 测试代码,对应你的R示例场景
int main() {
    // 构造R中的test向量 1~12
    std::vector<int> test;
    for (int i = 1; i <= 12; ++i) {
        test.push_back(i);
    }
    // 构造gl(2,3)对应的分组标签
    std::vector<int> groups = {1,1,1,2,2,2,1,1,1,2,2,2};

    auto test_list = split(test, groups);

    // 输出结果和R示例对齐
    std::cout << "$`1`" << std::endl;
    for (int num : test_list[1]) {
        std::cout << num << " ";
    }
    std::cout << std::endl << std::endl;

    std::cout << "$`2`" << std::endl;
    for (int num : test_list[2]) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

简化实现(适配你示例的固定2组场景)

如果你只需要处理固定2组的情况,可以写更简单的版本,不需要引入map:

#include <vector>
#include <utility>

std::pair<std::vector<int>, std::vector<int>> split_two_groups(const std::vector<int>& input, const std::vector<int>& groups) {
    std::vector<int> group1, group2;
    for (int i = 0; i < input.size(); ++i) {
        if (groups[i] == 1) {
            group1.push_back(input[i]);
        } else if (groups[i] == 2) {
            group2.push_back(input[i]);
        }
    }
    return {group1, group2};
}

运行结果

运行上述代码输出和你R示例的预期结果完全一致:

$`1`
1 2 3 7 8 9 

$`2`
4 5 6 10 11 12

注意事项

  • 请保证待拆分的输入向量和分组标签向量长度一致,避免下标越界
  • 通用版用unordered_map存储分组映射,支持任意数量的分组、修改模板即可支持字符串等其他类型的分组标签
  • 代码基于C++11及以上标准编写,主流编译器(GCC、Clang、MSVC)均可直接编译运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:54:01