我在C ++中有两个长度相同的数组。我想得到两个新的数组:第一个新数组将具有第一个原始数组的唯一元素,而第二个数组将具有第二个原始数组的相应值。例如:
原件:
1st: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
我希望得到:
1st:1 7 2 3 5 4 8 9 6
第二名:1 1 1 1 2 2 3 3 5
也许我可以使用哈希表,但不太确定如何做到这一点。任何解决方案都可以。在此先感谢您的帮助。
答案 0 :(得分:2)
以下两种方法代表了相当普遍的解决方案类型:
制作单个数组,并排序+统一:
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
的{{1}}的唯一值为i
,而[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]]
的唯一值位于[0, v.size())
中,而b
中的b[idx[i]]
的相应值位于Sub Filter_and_move_data()
Dim LastRow As Long
Sheets("Parsing").UsedRange.Offset(0).ClearContents
With Worksheets("Incidents_data")
.Range("$A:$G").AutoFilter
.Range("$A:$G").AutoFilter field:=1, Criteria1:="=Status Changed", Operator:=xlOr
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:G" & LastRow).SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Parsing").Range("A1")
End With
End Sub
。