我有一个由向量组成的矩阵,其中每个表示行的元素由表示矩阵列的向量组成。我想根据第1列对行进行排序。
此矩阵中的每个元素都是double
,尽管第一列包含一个用作标识符的数字(但不是唯一的)。
我的目标是使用SQL中可用的聚合函数,例如当我按第一列分组时,count()和sum()。
例如,如果我有:
ID VALUE
1 10
2 20
1 30
2 40
3 60
我想得到:
ID COUNT MEAN
1 2 20
2 2 30
3 1 60
但是,我陷入了第一步:如何根据每行第一个元素的值对行进行排序?
我找到了一条线索on this topic,并将比较器更改为:
bool compareFunction (double i,double j)
{
return (i<j);
}
但编译器对此并不满意(引用stl_algo.h文件):
error: cannot convert 'std::vector<double>' to 'double' in argument passing
因此,我想知道是否有办法在vector
个vector
包含double
时对其进行排序。
答案 0 :(得分:2)
您需要创建比较vector<double>
:
struct VecComp {
bool operator()(const vector<double>& _a, const vector<double>& _b) {
//compare first elements
}
}
然后,您可以使用新的比较器函数在结构上使用std::sort
:
std::sort(myMat.begin(), myMat.end(), VecComp());
如果您使用的是c ++ 11功能,您还可以在此处使用lambda函数:
std::sort(myMat.begin(), myMat.end(), [](const vector<double>& a, const vector<double>& b) {
//compare the first elements
}
);
答案 1 :(得分:2)
答案(imho):使用不同的数据结构。您要做的是设置多图。哦,嘿看:
http://www.cplusplus.com/reference/map/multimap/
stl::multimap - how do i get groups of data?
对于大量元素来说,它会更快。实际上它是一张地图而不是双向量的矢量。
或者,或者一起跳过排序,并使用std :: map,std :: unordered_map或(如果你知道键的数量和/或键偏移1而没有中断)按键计数的std ::矢量。
要进行扩展,对列表进行排序以获取均值将会很慢。排序(使用std :: sort)是O(nlogn),每次计算这个均值时都是O(nlogn)。这是一个有意义的步骤:你的东西按照关键的顺序分组。 std :: map和std :: multimap将&#34;按你的方式排序&#34;这将比每次排序快一点,但你不必对整个事情进行排序以获得列表。然后你可以迭代多图来得到均值,O(n)每个均值计算。 (将所有元素添加到多图中仍为O(nlg(n))
但是如果你知道关键输出将是1,2,3 ... n-1,n,那么排序完全是浪费时间。只需为每个键创建一个计数器(因为你知道键可以是什么)并在迭代数组时添加到键中。
但等等还有更多
如果密钥实际上是按照你的思维方式设置的,那么最好的方法就是忘记表格结构,并按照以下方式构建:
Index VALUE
0 10,30
1 20,40
2 60
现在计数是每行的常量时间。每行的平均值为O(n)。获取列表是每行的固定时间。每个人都赢了。
答案 2 :(得分:1)
您需要编写自己的比较器函数来传递到vector
声明:
struct comp {
bool operator() (const std::vector<double>& i,
const std::vector<double>& j) {
return i[0] < j[0];
}
答案 3 :(得分:0)
你试过这个吗?:
std::sort(vecOfVecs.begin(), vecOfVecs.end());
这应该有效,因为std::vector
有operator<
提供了词典排序,这比你想要的更具体。