我如何排序对象?

Fak*_*ken 1 c++ sorting class

我创建了一个类,并在该类下创建了一个对象数组,并用数据填充了所有这些对象.现在我想通过该类的特定成员对整个数组进行排序,如何使用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)

什么是比较器功能应该是什么样的?

sbi*_*sbi 5

您需要在数组中使用迭代器和一些排序标准.让我们从迭代器开始:

您将需要一个开始迭代器和一个结束迭代器.在开始迭代器需要指向第一个元素,结束迭代需要指向后面的最后一个元素.指针是完美的迭代器.数组可以隐式转换为指向其第一个元素的指针,因此您有一个开始迭代器.将数组中的元素数添加到它,你有一个结束迭代器.通过将数组的大小(字节数)除以单个元素的大小,可以获得数组中元素的数量.把它们放在一起:

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)

如果排序标准是没有固定(比如,有时候要排序依据foobar数据,有时会根据它的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告诉我该东西是一个容器.但是,它是要放入容器的物品的类型.选择标识符要小心.正确的命名在可读和可维护的代码方面有很长的路要走.