如何实现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
相关产品推荐
相关产品推荐

