我看了一些运气不好的例子,但我想执行一个非常简单的任务,我只想用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
变量对其进行排序
答案 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;
}