查找array2

时间:2018-01-10 18:08:27

标签: c++ arrays

我有一个包含id值集合的数组:

int arr1 [5] = {110, 111, 112, 113, 114};

并且还有另一个包含相同id值的数组,但顺序不同:

int arr2 [5] = {111, 113, 110, 114, 112}

“匹配”这两个数组元素的最快方法是什么?也就是说,我想要一些以arr1arr2作为参数的函数,并返回一个大小相等的新数组,它给每个arr1个元素一个对应的arr2中的索引。在这种情况下,返回应该是

{2, 0, 4, 1, 3}

也许这也是关于编程哲学的问题;我已经习惯了Python,并且一直使用Anaconda发行版,其中包括执行任何类型统计,许多算法的函数,以及通常被描述为矩阵运算的无数内容,例如我在此描述的那个,通过{ {1}}。因此,我养成了寻找包含我需要的功能的包的习惯。

但是,在C / C ++开发中,采用这种方法是不常见的?我应该自己写这个简单的任务吗?

2 个答案:

答案 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;
}

处理重复项。

Demo