关于 QObject 和 QVector<MyQObject*> 的 std::sort 问题

Problem on std::sort with QObject and QVector<MyQObject*>

我对 QVector 有疑问。这是用于列出目录和数据的实际情况(如 ls unix 命令)。在这个例子中,“/Users/Stephane/”在我的 unix mac os 计算机上。

std::sort功能不起作用,我确定我做错了。

这是我的控制台 Qt 文件:

entry.h

#ifndef ENTRY_H
#define ENTRY_H

#include <QObject>
#include <QString>
#include <QDateTime>

enum Type {
    File, Directory, Other
};


class Entry : public QObject
{
Q_OBJECT
public:
    explicit Entry(QObject *parent = nullptr);
    void setValue(Type type, QString name, int size_file);
    QString getName();
    int getSize();
    bool operator<(const Entry other);
signals:
private:
    QString name;
    Type type;
    int size_file;
};

#endif // ENTRY_H

entry.cpp

#include "entry.h"

Entry::Entry(QObject *parent)
        : QObject{parent}
{

}

void Entry::setValue(Type type, QString name, int size_file)
{
    this->type = type;
    this->name = name;
    this->size_file = size_file;
}

QString Entry::getName()
{
    return this->name;
}

int Entry::getSize() {
    return this->size_file;
}

bool Entry::operator<(const Entry other) {
    return this->name < other.name;
}

main.cpp

#include <QCoreApplication>
#include "entry.h"
#include <sys/stat.h>
#include <dirent.h>
#include <QDebug>
#include <iostream>
#include <QDateTime>

struct EntryCompare {
    bool operator()(const Entry *a, const Entry *b) {
        return(a < b);
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // My vector
    QVector<Entry*> vec_entry;
    QString directory = "/Users/Stephane/";

    // Read dir/file
    struct dirent *lecture;
    DIR *dir;
    struct stat buf;
    QString currentPath;

    dir = opendir(directory.toLocal8Bit());
    if (dir == NULL) {
        qCritical() << directory << " don't exist";
        return a.exec();
    }

    while ((lecture = readdir(dir)) != NULL) {
        if (strcmp(lecture->d_name, ".") != 0) {
            currentPath = directory + lecture->d_name;
            const char *charCurrentPath = currentPath.toLocal8Bit();
            if ((stat(charCurrentPath, &buf)) == -1) {
                qCritical() << "stat" << currentPath;
            }
            int size = buf.st_size;
            Entry *entry = new Entry();
            if (!strcmp(lecture->d_name, "..")) {
                entry->setValue(Type::Directory, lecture->d_name, 0);
                vec_entry.append(entry);
            } else {
                vec_entry.append(entry);
                if (S_ISDIR(buf.st_mode)) {
                    QString qstringTemp = lecture->d_name;
                    qstringTemp += "/";
                    entry->setValue(Type::Directory, qstringTemp, 0);
                } else {
                    entry->setValue(Type::File, lecture->d_name, size);
                }
            }
        }
    }
    closedir(dir);

    // This part doesn't work
    std::sort(vec_entry.begin(), vec_entry.end(), EntryCompare());

    foreach(Entry *v, vec_entry) {
        qInfo() << "Vector entry:" << v << "Name:" << v->getName() << "Size:" << v->getSize();
    }

    return a.exec();
}

当您将指针传递给任何函数时,您有责任取消对该指针的引用并从中获取它指向的信息。这不是自动的——您必须编写代码才能完成。

至于std::sort“不工作”,它完全按照你写的那样工作。您的比较规范正在比较两个指针的值。您有责任提供 std::sort

  1. 适当的排序范围,加上
  2. 对两个值进行排序的正确排序标准,加上
  3. 排序标准遵循“strict-weak-ordering”(关于哪个项目放在另一个项目之前没有歧义)。

如果您这样做,std::sort 将一直有效。如果结果有误,您一定违反了这些先决条件中的一项或多项。您的代码违反了第 2 点)。

您很可能打算执行以下操作:

struct EntryCompare 
{
    bool operator()(Entry *a, Entry *b) const
    {
        return(a->getName() < b->getName());
    }
};

这会比较 ab 指向的名称。