gpt4 book ai didi

c++ - 如何按元素出现次数将多重集排序到容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:58 26 4
gpt4 key购买 nike

我想获取按元素出现次数排序的元素。这就是我想出的(mHeights 是一个 std::multiset):

namespace{
template<class U,class T>
class HistPair{
public:
HistPair(U count,T const& el):mEl(el),mNumber(count){
}
T const& getElement()const{return mEl;}

U getCount()const{return mNumber;}
private:
T mEl;
U mNumber;
};

template<class U,class T>
bool operator <(HistPair<U,T> const& left,HistPair<U,T> const& right){
return left.getCount()< right.getCount();
}
}

std::vector<HistPair<int,double> > calcFrequentHeights(){
typedef HistPair<int,double> HeightEl;
typedef std::vector<HistPair<int,double> > Histogram;
std::set<double> unique(mHeights.begin(),mHeights.end());
Histogram res;
boostForeach(double el, unique) {
res.push_back(HeightEl(el,mHeights.count(el)));
}
std::sort(res.begin(),res.end());
std::reverse(res.begin(),res.end());
return res;
}

因此,首先我从多重集中取出所有唯一元素,然后对它们进行计数并将它们分类到一个新容器中(我需要计数,所以我使用了 map )。对于如此简单的任务,这看起来相当复杂。除了也在其他地方使用的 HistPair 之外,没有任何 STL 算法可以简化此任务,例如使用 equal_range 或 sth。一样。

编辑:我也需要出现的次数,抱歉我忘记了

最佳答案

这段代码通过组合 std::set、lambda 和 std::multiset::count 来完成您想要的:

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

int main() {
std::multiset<int> st;
st.insert(12);
st.insert(12);
st.insert(12);
st.insert(145);
st.insert(145);
st.insert(1);
st.insert(2);

std::set<int> my_set(st.begin(), st.end());
std::vector<int> my_vec(my_set.begin(), my_set.end());
std::sort(my_vec.begin(), my_vec.end(),
[&](const int &i1, const int &i2) {
return st.count(i1) < st.count(i2);
}
);

for(auto i : my_vec) {
std::cout << i << " ";
}
std::cout << std::endl;
}

您可能想要反转 vector 。这输出:

1 2 145 12

编辑:考虑到您还需要项目计数,这样做就可以了:

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

int main() {
typedef std::vector<std::pair<int, int>> MyVector;
std::multiset<int> st;
st.insert(12);
st.insert(12);
st.insert(12);
st.insert(145);
st.insert(145);
st.insert(1);
st.insert(2);

std::set<int> my_set(st.begin(), st.end());
MyVector my_vec;
my_vec.reserve(my_set.size());

for(auto i : my_set)
my_vec.emplace_back(i, st.count(i));

std::sort(my_vec.begin(), my_vec.end(),
[&](const MyVector::value_type &i1, const MyVector::value_type &i2) {
return i1.second < i2.second;
}
);

for(const auto &i : my_vec)
std::cout << i.first << " -> " << i.second << std::endl;
}

哪些输出:

1 -> 1
2 -> 1
145 -> 2
12 -> 3

关于c++ - 如何按元素出现次数将多重集排序到容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com