使用算法标题对structArray进行排序

时间:2017-08-11 20:47:29

标签: c++ algorithm sorting

我看了一些运气不好的例子,但我想执行一个非常简单的任务,我只想用algorithm header

对结构进行排序
    struct MyStruct
    {
        int level; //sort according to this
        int m; 
        char ks;
    };
    int main() {

    MyStruct* ary = new MyStruct[SIZE];
    sort(ary, ary + tota_stored); //this part

        for (int j = 0; j <tota_stored; j++)
         {
           cout << ary[j].level<< ary[j].m<< ary[j].ks<< " \n"; //print sorted
         }

     return 0;
    }

我想根据结构

中的level变量对其进行排序

2 个答案:

答案 0 :(得分:3)

您可以为std :: sort提供谓词,如

std::vector<MyStruct> ary(SIZE);
std::sort(ary.begin(), ary.end(), [](auto a, auto b){return a.level < b.level;});

首先,我建议您不要在C ++ modern中使用new, new[], delete, delete[]。 最好使用Container和Smart Pointers(我在这里使用std::vector

其次,意思是:[](auto a, auto b){return a.level < b.level;}

这是一个名为lambda的“对象”。 Lambda有点像函数或类似的东西。这个“函数”有两个参数:a和b,它们的类型在编译时自动推导出来(感谢auto)。

整个函数就是我们所谓的谓词。在这里,您只想比较级别部分,这就是我使用a.level < b.level的原因。

此外,您可以在此处查看std::sort功能的文档: http://en.cppreference.com/w/cpp/algorithm/sort

如你所见,我正在使用这个:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

Compare comp这是我用lambda定义的谓词。

有关lambda的更多信息https://stackoverflow.com/a/7627218/4950448

然而,如果像MichaëlRoy所说,你必须使用C ++ 98,你可以使用“仿函数”(不确定名称)

struct CompareStructOperatorLess {
    bool operator()(const MyStruct &a, const MyStruct &b) const {
        return a.level < b.level;
    }
};
...
std::sort(ary.begin(), ary.end(), CompareStructOperatorLess());

答案 1 :(得分:2)

在c ++ 11及更高版本中,您可以使用Antoine的基于lambda函数的解决方案。如果你必须使用c ++ 98,或者level数据成员是 有意义的值来比较你的结构数据,或者你希望进行大量的比较,或者比较更复杂,您可以创建一个运算符来帮助您订购struct值。

struct MyStruct
{
    int level; //sort according to this
    int m; 
    char ks;

    friend inline bool operator < (const Mystruct& a, const MysStruct& b)
    {
        return a.level < b.level;
    }
};

int main() 
{
    MyStruct* ary = new MyStruct[SIZE];
    size)t total_stored = SIZE;
    sort(ary, ary + total_stored);  // <-- operator < will be called.

    for (int j = 0; j <tota_stored; j++)
    {
        cout << ary[j].level<< ary[j].m<< ary[j].ks<< " \n"; //print sorted
    }

    return 0;
}