关于 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
- 适当的排序范围,加上
- 对两个值进行排序的正确排序标准,加上
- 排序标准遵循“strict-weak-ordering”(关于哪个项目放在另一个项目之前没有歧义)。
如果您这样做,std::sort
将一直有效。如果结果有误,您一定违反了这些先决条件中的一项或多项。您的代码违反了第 2 点)。
您很可能打算执行以下操作:
struct EntryCompare
{
bool operator()(Entry *a, Entry *b) const
{
return(a->getName() < b->getName());
}
};
这会比较 a
和 b
指向的名称。
我对 QVector
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
- 适当的排序范围,加上
- 对两个值进行排序的正确排序标准,加上
- 排序标准遵循“strict-weak-ordering”(关于哪个项目放在另一个项目之前没有歧义)。
如果您这样做,std::sort
将一直有效。如果结果有误,您一定违反了这些先决条件中的一项或多项。您的代码违反了第 2 点)。
您很可能打算执行以下操作:
struct EntryCompare
{
bool operator()(Entry *a, Entry *b) const
{
return(a->getName() < b->getName());
}
};
这会比较 a
和 b
指向的名称。