在 C++ 中保留数组的唯一元素

Keeping unique elements of an array in C++

我在 C++ 中有两个长度相同的数组。我想从中得到两个新数组:第一个新数组将具有第一个原始数组的唯一元素,而第二个新数组具有第二个原始数组的相应值。例如:

原文:

第一名:1 7 2 3 5 4 4 8 9 9 4 6 7

第二名:1 1 1 2 2 2 3 3 3 4 4 5 5

我想得到:

第一名:1 7 2 3 5 4 8 9 6

第二名:1 1 1 1 2 2 3 3 5

也许我可以使用哈希表,但不太确定如何使用。任何一种解决方案都可以。在此先感谢您的帮助。

以下两种方法代表了相当普遍的解决方案类型:

  1. 制作一个单对数组并排序+唯一化:

    int a[N], b[N];  // ... your data
    
    std::vector<std::pair<int, int>> v({{a[0], b[0]}, /*...*/, {a[N-1], b[N-1]}});
    
    std::sort(
        v.begin(), v.end(),
        [](const auto & lhs, const auto & rhs) { return lhs.first < rhs.first; });
    auto it = std::unique(
        v.begin(), v.end(),
        [](const auto & lhs, const auto & rhs) { return lhs.first == rhs.first;});
    v.erase(it, v.end());
    

    现在 a 的唯一值是 v[i].first for i in [0, v.size())b 的对应条目分别是 v[i].second.

  2. 通过间接方式对索引数组进行排序和唯一化:

    std::vector<std::size_t> idx({0, 1, 2, /* ... */, N - 1});
    
    std::sort(
        idx.begin(), idx.end(),
        [&a](std::size_t i, std::size_t j) { return a[i] < a[j]; });
    auto it = std::unique(
        v.begin(), v.end(),
        [&a](std::size_t i, std::size_t j) { return a[i] == a[j]; });
    v.erase(it, v.end());
    

    现在 a 的唯一值在 a[idx[i]] for i in [0, v.size()) 中,b 的对应值在 b[idx[i]] 中。