我创建了一个类,并在该类下创建了一个对象数组,并用数据填充了所有这些对象.现在我想通过该类的特定成员对整个数组进行排序,如何使用stable_sort()函数执行此操作?
编辑:好的,我现在有这个,
class sortContiner
{
public:
double position;
int key;
double offsetXposition;
double offsetYposition;
int origXposition;
int origYposition;
};
Run Code Online (Sandbox Code Playgroud)
我已经声明了这样的数组:
sortContiner * sortList = new sortContiner [length];
Run Code Online (Sandbox Code Playgroud)
现在我想要使用stable_sort()这样的sortList .position成员对它进行排序:
stable_sort(sortList, sortList + length, ????);
Run Code Online (Sandbox Code Playgroud)
什么是比较器功能应该是什么样的?
您需要在数组中使用迭代器和一些排序标准.让我们从迭代器开始:
您将需要一个开始迭代器和一个结束迭代器.在开始迭代器需要指向第一个元素,结束迭代需要指向后面的最后一个元素.指针是完美的迭代器.数组可以隐式转换为指向其第一个元素的指针,因此您有一个开始迭代器.将数组中的元素数添加到它,你有一个结束迭代器.通过将数组的大小(字节数)除以单个元素的大小,可以获得数组中元素的数量.把它们放在一起:
foo array[10];
const std::size_t array_size = sizeof(array)/sizeof(array[0]);
const int* array_begin = array; // implicit conversion
const int* array_end = begin + array_size;
Run Code Online (Sandbox Code Playgroud)
现在,你需要一些算法来决定你的两个给定对象中哪一个是较小的一个.一个简单的方法是operator<
为您的班级重载:
bool operator<(const foo& lhs, const foo& rhs)
{
// compares using foo's bar
return lhs.get_bar() < rhs.get_bar();
}
Run Code Online (Sandbox Code Playgroud)
现在您可以对数组进行排序:
std::stable_sort( array_begin, array_end );
Run Code Online (Sandbox Code Playgroud)
如果排序标准是没有固定(比如,有时候要排序依据foo
的bar
数据,有时会根据它的wrgly
数据),你可以通过不同的排序标准来排序算法作为可选的第三个参数.排序标准应该是类似函数的实体.这可以是函数或函数对象.后者提供内联,这就是为什么它们通常更好.这两个是:
bool compare_by_bar(const food& lhs, const foo& rhs)
{
return lhs.get_bar() < rhs.get_bar();
}
struct wrgly_comparator {
bool operator()(const food& lhs, const foo& rhs) const
{
return lhs.get_wrgly() < rhs.get_wrgly();
}
};
Run Code Online (Sandbox Code Playgroud)
这是你如何使用它们:
std::stable_sort( array_begin, array_end, compare_by_bar );
wrgly_comparator wc;
std::stable_sort( array_begin, array_end, wc );
Run Code Online (Sandbox Code Playgroud)
您还可以动态创建比较器:
std::stable_sort( array_begin, array_end, wrgly_comparator() );
Run Code Online (Sandbox Code Playgroud)
编辑:根据您的扩展问题,这里有一些提示:
sortContainer * sortList = new sortContiner [length];
将在堆上创建一个动态数组.在C++中,没有垃圾收集,你负责自己清理堆(在这种情况下通过调用delete[] sortList;
).对于新手而言,这是非常难以做到的,即使对于经验丰富的程序员也容易出错.你想要的是一个非常好的机会是自动数组:sortContainer sortList[length];
在堆栈上.
标识符sortContainer
告诉我该东西是一个容器.但是,它是要放入容器的物品的类型.选择标识符要小心.正确的命名在可读和可维护的代码方面有很长的路要走.