根据你对user2357112问题的回答我会写一个解决方案。
所以,让我们假设我们将使用一个向量而不是 unordered_set,并且我们的向量具有如下值:
{1, 1, 1, 3, 4, 1, 1, 4, 4, 5, 5};
所以,我们想要获得特定值在向量中出现多少次的数字(我认为是不同的向量),对吧?在这种特定情况下,结果将是:1 出现 5 次,3 出现 1 次,4 出现 3 次,5 出现 2 次。
要完成此操作,一种可能的解决方案如下:
- 从源向量中获取唯一条目并将它们存储在不同的向量中,因此该向量将包含:1、3、4、5
- 遍历整个唯一向量并从源向量中计算这些元素。
- 打印结果
第 1 点的代码可以是这样的:
template <typename Type>
vector<Type> unique_entries (vector<Type> vec) {
for (auto iter = vec.begin (); iter != vec.end (); ++iter) {
auto f = find_if (iter+1, vec.end (), [&] (const Type& val) {
return *iter == val;
});
if (f != vec.end ()) {
vec.erase (remove (iter+1, vec.end (), *iter), vec.end ());
}
}
return vec;
}
第2点的代码可以是这样的:
template <typename Type>
struct Properties {
Type key;
long int count;
};
template <typename Type>
vector<Properties<Type>> get_properties (const vector<Type>& vec) {
vector<Properties<Type>> ret {};
auto unique_vec = unique_entries (vec);
for (const auto& uv : unique_vec) {
auto c = count (vec.begin (), vec.end (), uv); // (X)
ret.push_back ({uv, c});
}
return ret;
}
当然我们不需要Properties 类来存储key 和count 值,你可以只返回一个int 的向量(带有元素的数量),但正如我所说,它是一种可能的解决方案。因此,通过使用 unique_entries 我们得到一个具有唯一条目 (:) 的向量,然后我们可以遍历整个向量 vec (get_properties,使用 std:: count 标记为 (X)),并 push_back 属性对象到向量 ret。
第 3 点的代码可以是这样的:
template <typename Type>
void show (const vector<Properties<Type>>& vec) {
for (const auto& v : vec) {
cout << v.key << " " << v.count << endl;
}
}
// usage below
vector<int> vec {1, 1, 1, 3, 4, 1, 1, 4, 4, 5, 5};
auto properties = get_properties (vec);
show (properties);
结果如下所示:
1 5
3 1
4 3
5 2
值得注意的是,此示例是使用模板编写的,以提供在向量中选择元素类型的灵活性。如果要存储 long、long long、short 等值,而不是 int 类型,只需更改源向量的定义即可,例如:
vector<unsigned long long> vec2 {1, 3, 2, 3, 4, 4, 4, 4, 3, 3, 2, 3, 1, 7, 2, 2, 2, 1, 6, 5};
show (get_properties (vec2));
将产生:
1 3
3 5
2 5
4 4
7 1
6 1
5 1
这是想要的结果。
还有一点,你也可以用字符串向量来做到这一点。
vector<string> vec_str {"Thomas", "Rick", "Martin", "Martin", "Carol", "Thomas", "Martin", "Josh", "Jacob", "Jacob", "Rick"};
show (get_properties (vec_str));
结果是:
Thomas 2
Rick 2
Martin 3
Carol 1
Josh 1
Jacob 2