对指向自定义对象的指针的 QVector 进行排序
Sort QVector of pointers to custom objects
我的问题:
为 QVector<Camera*>
中的每个 Camera
分配数字的最佳方法是什么,其中应适用以下规范:
- 未排序的
QVector
应该保持其顺序
- 每个
Camera
的 int number
应根据其 QString macAddress
分配
- 对于 "lowest" macAddress (
QString::operator<
) ,int number
应该以 0
开头
来源:
class Camera {
int number;
QString macAddress;
}
当前解法:
我目前的解决方案是:
实施Camera::operator<
bool Camera::operator<(const Camera &cam) const {
return(this->macAddress < cam.macAddress);
}
实现比较结构
struct CameraCompare {
bool operator()(const Camera *a, const Camera *b) {
return(*a < *b);
}
}
创建一个指向相同相机对象的指针的临时 QVector,然后在临时向量上使用 std::sort
并分配如下数字:
QVector<Camera*> tempVector;
for(quint8 i = 0; i < cameras->size(); i++) {
Camera *temp = (*cameras)[i];
tempVector.append(temp);
}
std::sort(tempVector.begin(), tempVector.end(), CameraCompare());
for(quint8 i = 0; i < tempVector.size(); i++) {
tempVector[i]->setNumber(i); // Edited
}
编辑:我现在的问题是:有没有更好的方法来完成这个?
您的解决方案没有任何问题。它对向量进行了很好的排序。但这里似乎有问题:
for(quint8 i = 0; i < tempVector.size(); i++) {
cameras->at(i)->setNumber(i);
}
此代码设置每个摄像机的 number
,它在 原始 向量中的索引,而不是排序后的向量。我认为应该替换为:
for(quint8 i = 0; i < tempVector.size(); i++) {
int number = tempVector.indexOf(cameras.at(i));
cameras->at(i)->setNumber(number);
}
我的问题:
为 QVector<Camera*>
中的每个 Camera
分配数字的最佳方法是什么,其中应适用以下规范:
- 未排序的
QVector
应该保持其顺序 - 每个
Camera
的int number
应根据其QString macAddress
分配
- 对于 "lowest" macAddress (
QString::operator<
) ,
int number
应该以 0
开头
来源:
class Camera {
int number;
QString macAddress;
}
当前解法:
我目前的解决方案是:
实施
Camera::operator<
bool Camera::operator<(const Camera &cam) const { return(this->macAddress < cam.macAddress); }
实现比较结构
struct CameraCompare { bool operator()(const Camera *a, const Camera *b) { return(*a < *b); } }
创建一个指向相同相机对象的指针的临时 QVector,然后在临时向量上使用
std::sort
并分配如下数字:QVector<Camera*> tempVector; for(quint8 i = 0; i < cameras->size(); i++) { Camera *temp = (*cameras)[i]; tempVector.append(temp); } std::sort(tempVector.begin(), tempVector.end(), CameraCompare()); for(quint8 i = 0; i < tempVector.size(); i++) { tempVector[i]->setNumber(i); // Edited }
编辑:我现在的问题是:有没有更好的方法来完成这个?
您的解决方案没有任何问题。它对向量进行了很好的排序。但这里似乎有问题:
for(quint8 i = 0; i < tempVector.size(); i++) {
cameras->at(i)->setNumber(i);
}
此代码设置每个摄像机的 number
,它在 原始 向量中的索引,而不是排序后的向量。我认为应该替换为:
for(quint8 i = 0; i < tempVector.size(); i++) {
int number = tempVector.indexOf(cameras.at(i));
cameras->at(i)->setNumber(number);
}