在 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
也许我可以使用哈希表,但不太确定如何使用。任何一种解决方案都可以。在此先感谢您的帮助。
以下两种方法代表了相当普遍的解决方案类型:
制作一个单对数组并排序+唯一化:
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
.
通过间接方式对索引数组进行排序和唯一化:
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]]
中。
我在 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
也许我可以使用哈希表,但不太确定如何使用。任何一种解决方案都可以。在此先感谢您的帮助。
以下两种方法代表了相当普遍的解决方案类型:
制作一个单对数组并排序+唯一化:
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
fori
in[0, v.size())
,b
的对应条目分别是v[i].second
.通过间接方式对索引数组进行排序和唯一化:
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]]
中。