【问题标题】:Issue with sorting algorithm and object pointers排序算法和对象指针的问题
【发布时间】:2019-07-31 23:29:48
【问题描述】:

我有一个包含一些数据的对象,例如:

class Employee{
    private:
         int employee_number;
         // +more objects and data
    public:
        int get_number() {
            return employee_number;
        }
};

对象存储在指针数组中:

Employee* employees[MAX + 1];

Employee中的第一个元素没有被使用,所以算法跳过了employees[0]

每次添加新员工时都会调用排序算法,排序算法如下所示:

int to = employees.length - 1;
for (int from = 1; from < to; from++) {
    if (employees[from]->get_number() > employees[from + 1]->get_number()) {
        Employee *tmp = employees[from + 1];
        int i = from;

        while (i >= 1 && employees[i]->get_number() > tmp->get_number()) {
            employees[i + 1] = employees[i];
            i--;
        }

        employees[i + 1] = tmp;
    }
}

我不确定为什么这不对雇员数组进行排序,因为该算法适用于常规 int 数组。另外请记住,我的整个代码都是用我自己的语言编写的,所以我必须在这里翻译成英文。

【问题讨论】:

  • 您的tmp 成员只是一个指针,您确定这就是您的意图吗?我希望您需要一个额外的 Employee 对象来进行这样的就地排序
  • 部分分配是让构造函数读取用户输入,所以如果我这样做 Employee tmp = new Employee; 它将调用构造函数,所以我想在这种情况下我需要绕过构造函数。
  • employees.length 对于Employee* employees[MAX + 1] 的格式不正确
  • @eerorika 是的,对不起,应该放点别的东西,在源代码中它是一个整数,代表下一个值。例如int lastUsed = 1,每次创建新员工时都会增加。我认为在这里使用 .length 代表相同的想法
  • std::sort 与 lambda 谓词有什么问题?对于这么简单的问题,这看起来太复杂了。

标签: c++ algorithm sorting


【解决方案1】:

假设您想按照它们指向的对象的数据成员employee_number(即employee_number是键)对Employee指针进行升序排序,您可以使用以下谓词定义lambda 表达式:

auto cmp = [](auto a, auto b) {
   return a->get_number() < b->get_number();
};

然后,使用带有上述谓词的std::sort() 算法:

auto begin = &employees[1]; // skip 1st element
std::sort(begin, employees + num, cmp);

上面的num1(因为你说第一个条目没有被使用)加上到目前为止插入的Employee指针的数量。


我不太确定您想要实现什么,但如果您打算在每次将新的 Employee 添加到数组时在数组上调用 std::sort(),您可能需要考虑使用另一个容器像 std::set 而不是数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多