按照gc值对整个结构体数组进行排序

3

我该如何对整个结构体以及数组中的所有元素按照 double gc 从小到大排序?

我不知道从哪里开始,我已经苦苦挣扎了几个小时。

struct DNA
{
    vector <string>header;
    string DNAstrand;
    double gc;
    int valid; // 0 not valid | 1 valid
};
struct World
{
    //  int     numCountries;
    DNA dnas[MAX_DNA_SIZE];
} myWorld;

基本上我的目标是使用gc从低到高排列所有元素,因此如果我拉取myWorld.dnas[2].valid或类似的内容,它将与其排序后的gc相关联。

所以基本上,您想使用gc作为关键字进行排序? - templatetypedef
如果这是术语,是的,请执行。@templatetypedef - soniccool
但我不需要任何复杂的树排序算法等。@templatetypedef - soniccool
2个回答

2

使用C++11和std::sort这个很容易实现:

std::sort(std::begin(myWorld.dnas), std::end(myWorld.dnas), [](const DNA& dna1, const DNA& dna2) { return dna1.gc < dna2.gc; });

同样的事情,我的C++编译器可能不支持它吗?@user2296177 - soniccool
Lambda表达式是C++11的特性,原始答案说明它是C++11代码。因此,您需要创建一个函数对象。 - user2296177
是的,我之前并不知道我没有使用C++11。@user2296177。所以需要一个自定义函数? - soniccool
@sonicboom,我已经发布了一个答案,你可以尝试并评论它是否有效。 - user2296177
1
@sonicboom:不是自定义函数,而是一个函数对象。它包装和封装了一个函数,请查看:http://stackoverflow.com/questions/15181378/stdsort-functor-one-line - Jack
显示剩余9条评论

1

由于您似乎没有C++11,您可以尝试以下方法:

#include <algorithm>

int main()
{
    struct
    {
        bool operator()( DNA const& a, DNA const& b )
        {
            return a.gc < b.gc;
        }
    } dna_comparer;

    std::sort( myWorld.dnas, myWorld.dnas + MAX_DNA_SIZE, dna_comparer );
}

非常感谢!我现在遇到了这个错误 error: no matching function for call to 'sort(DNA [5000], DNA*, <anonymous struct>&)'| @user2296177 - soniccool
我将其更改为 static bool dna_comparator(DNA a, DNA b) { return a.gc > b.gc; },看起来它似乎可以工作。我走在正确的道路上吗? - soniccool
@sonicboom 使用>将它们按降序排序。使用DNA而不是DNA const&每次调用比较器时都会产生两个副本。尽管如此,它仍然可以工作。 - user2296177
@sonicboom 是的,但是请你自己测试这样的东西;没有人愿意回答那些可以很容易地通过自己验证的问题。 - user2296177

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接