我有一个带有如下元素的 std 向量:
[0 , 1 , 2 , 0 , 2 , 1 , 0 , 0 , 188 , 220 , 0 , 1 , 2 ]
除了暴力 O(n^2) 算法之外,查找和复制此向量中仅出现一次的元素的最有效方法是什么?在这种情况下,新列表应包含[188, 220]
- Make an
unordered_map<DataType, Count> count;
- 迭代输入向量,增加每个值的计数。有点
count[value]++;
- 迭代
count
映射复制值为 1 的键。
It's O(n)
。您有哈希值,因此对于小数据集,法线贴图可能更有效,但从技术上讲,它会O(n log n)
.
对于离散数据集来说这是一个很好的方法。
代码示例:
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v{1,1,2,3,3,4};
unordered_map<int,int> count;
for (const auto& e : v) count[e]++;
vector<int> once;
for (const auto& e : count) if(e.second == 1) once.push_back(e.first);
for (const auto& e : once) cout << e << '\n';
return 0;
}
我尝试过一些想法。但我看不到解决办法map
. unordered_multiset
这几乎是一个很好的方法......除了它不允许您迭代键。它有一个方法来检查密钥的数量,但是您需要另一组密钥来探测。我不认为这是一种更简单的方法。在现代 C++ 中auto
计数很容易。我也看过algorithm
图书馆,但我还没有找到transfrom
, copy_if
, generate
等,可以有条件地转换元素(如果计数为 1,则映射条目 -> 值)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)