【问题标题】:Keeping unique elements of an array in C++在 C++ 中保留数组的唯一元素
【发布时间】:2015-11-22 12:24:48
【问题描述】:

我在 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

也许我可以使用哈希表,但不太确定该怎么做。任何一种解决方案都可以。提前感谢您的帮助。

【问题讨论】:

  • 你想像原始数组一样保持元素的顺序吗?
  • 您的阵列有多大,常见情况?如果它像几十个元素,你可能会更好地使用一个连续的表示(std::vector 或理想的优化以避免在如此小的情况下免费存储)。如果它更大,std::set。哦,安东说了什么——你想保留插入顺序吗?
  • 关于反对票和接近票,这个问题可能很有趣(除非它只是精确地要求std::set,例如),但您必须更明确地说明您的要求。不要气馁——尝试编辑问题以使其更明确。另一个是数据约束——它们总是整数吗?如果是这样,在一个狭窄的范围内?
  • 感谢回复,输出中的顺序并不重要,结果可能按第一个数组/向量排序,但对应关系必须保持:1st:1 2 3 4 5 6 7 8 9 // 2nd: 1 1 1 2 2 5 1 3 3 也可以。大小可以达到 10000 个元素。是的,两个数组中只有整数,范围在 0 到 9999 之间。你也可以使用向量,我只是选择了数组。

标签: c++ arrays unique


【解决方案1】:

以下是代表相当通用类型解决方案的两种方法:

  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,对于i[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 在[0, v.size())b 的对应值在b[idx[i]]

【讨论】:

  • 非常感谢您的回复。我尝试使用第一个版本,但我的编译器(Dev-C++)出现错误。第一个是 [Error] no matching function for call to 'std::vector<:pair int> >::vector()'。我是 C++ 新手,我不明白这个错误,我试图修复它但没有成功。您能否提供一个提示如何使其运行?再次感谢。
  • @km1234:代码使用contemporary C++(C++14);如果您的编译器不支持,则需要将代码修改为对应的 C++03 形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多