C++ 数组操作(类似 Python 的操作)

2 投票
5 回答
912 浏览
提问于 2025-04-15 20:47

我正在寻找一个适合在C++中进行数组操作的库或工具,希望它能像Python那样简单。基本上,我需要的简单程度是这样的:

values  = numpy.array(inp.data)
idx1    = numpy.where(values > -2.14)
idx2    = numpy.where(values < 2.0)

res1 = (values[idx1] - diff1)/1000
res2 = (values[idx2] - diff2)*1000

在Python中,这只需要5行代码,但在C++中,我想到的最简单方法却是很多嵌套的循环。请给我一些建议。

我的问题主要是关于数组或向量的操作,比如数组的乘法、对索引的操作等等。在上面的例子中,res1是一个数组,它包含了一些从values数组中筛选出来的元素,并且在此基础上进行了某些数学运算(比如减法和乘法,针对所有选中的元素)。在这个Python的例子中,我并没有复制values数组中的元素,因为它可能会占用很多内存,我只保留了索引,并希望能够对原始数组中选定的一组元素进行数学运算。

5 个回答

4

我建议你查看一下算法的头文件。

另外,不要使用数组,你可以用 std::vector 或者即将成为标准的 boost::array。

维基百科的文章

所有算法的参考资料

5

在C++中,你可以实现类似的功能,但最好不要使用普通的C数组。

我觉得最简单的方法是使用一个std::set来存储浮点数(你的代码看起来是默认数据是按升序排列的)。你也可以使用std::vector来存放浮点数,但你需要自己排序,可能需要用到std::sort

在这种情况下,你的示例代码可能会像这样——使用set的话,假设这些值是唯一的,如果不是,你可以用std::multiset来代替;

std::set<float> values(inp.data.begin(), inp.data.end());
std::set<float>::iterator idx1 = values.lower_bound(-2.14);
std::set<float>::iterator idx2 = values.upper_bound(2.0);

float res1 = (*idx1 - diff1) / 1000.0;
float res2 = (*idx2 - diff2) / 1000.0;

请注意,上面的代码示例并不是你原始代码的100%转换——lower_bound会给你第一个等于或大于-2.14的元素。我也没有加入任何失败检查的代码——如果lower_boundupper_bound找不到匹配的元素,它们会返回values.end(),比如说。

如果使用vector,示例看起来会非常相似,只是多了一行代码来预先排序这个vector:

std::vector<float> values(inp.data.begin(), inp.data.end());
std::sort(values.begin(), values.end();
std::vector<float>::iterator idx1 = std::lower_bound(values.begin(), values.end(), -2.14);
std::vector<float>::iterator idx2 = std::upper_bound(values.begin(), values.end(), 2.0);

float res1 = (*idx1 - diff1) / 1000.0;
float res2 = (*idx2 - diff2) / 1000.0;
5

你根本不应该使用数组。请花点时间好好学习一下std::vector类,还有迭代器和标准库的算法。我强烈建议你读一下这本书:C++标准库

撰写回答