我有一个包含id
值集合的数组:
int arr1 [5] = {110, 111, 112, 113, 114};
并且还有另一个包含相同id
值的数组,但顺序不同:
int arr2 [5] = {111, 113, 110, 114, 112}
“匹配”这两个数组元素的最快方法是什么?也就是说,我想要一些以arr1
和arr2
作为参数的函数,并返回一个大小相等的新数组,它给每个arr1
个元素一个对应的arr2
中的索引。在这种情况下,返回应该是
{2, 0, 4, 1, 3}
。
也许这也是关于编程哲学的问题;我已经习惯了Python,并且一直使用Anaconda发行版,其中包括执行任何类型统计,许多算法的函数,以及通常被描述为矩阵运算的无数内容,例如我在此描述的那个,通过{ {1}}。因此,我养成了寻找包含我需要的功能的包的习惯。
但是,在C / C ++开发中,采用这种方法是不常见的?我应该自己写这个简单的任务吗?
答案 0 :(得分:0)
最简单的解决方案是:
const int size=sizeof(arr1)/sizeof(arr1[0]);
int res [size];
for( unsigned int a = 0; a < size; a = a + 1 ){
for( unsigned int b = 0; b < size; b = b + 1 ){
if(arr1[a]==arr2[b]){
res[a]=b;
break;
}
}
}
请注意,此解决方案希望两个阵列具有相同的大小。
我认为对于C ++你不会导入一个大型库只是为了使用它的一个简单的功能,我会在同一个文件中创建一个函数并简单地调用它。
答案 1 :(得分:0)
您可以使用以下内容:
template <typename T, std::size_t N>
std::array<std::size_t, N> getPermutation(const std::array<T, N>& base,
const std::array<T, N>& arr)
{
std::array<std::size_t, N> res;
std::iota(res.begin(), res.end(), 0u);
for (std::size_t i = 0; i != res.size() + 1; ++i) {
for (auto j = i; j != res.size(); ++j) {
if (arr[res[j]] == base[i]) {
std::swap(res[i], res[j]);
break;
}
}
}
return res;
}
处理重复项。