我有一个名为“UltrasoundTemplate”的课程。这些UltrasoundTemplate对象包含一个int参数,该参数显示何时定义它们(类似于时间戳)。我有一个名为“UltrasoundTarget”的类,其中包含一个UltrasoundTemplate的矢量。 我使用push_back(ultrasoundTemplate)将UltrasoundTemplates添加到矢量中。
现在我想按时间戳的顺序对矢量进行排序,而不是将它们添加到矢量中的顺序。
我在谷歌找到了很多答案,这些答案都向我展示了相同的解决方案,但显然我仍然做错了什么。以下是我认为寻找解决方案所需的代码片段:
ultrasoundTemplate.h
class UltrasoundTemplate
{
public:
UltrasoundTemplate(/*...*/);
int getVolumePos() { return volume_; }
private:
int volume_;
};
ultrasoundTarget.h
//the sort algorithm
struct MyTemplateSort {
bool operator() ( UltrasoundTemplate t1, UltrasoundTemplate t2){
int it1 = t1.getVolumePos();
int it2 = t2.getVolumePos();
if (it1 < it2)
return true;
return false;
}
};
class UltrasoundTarget
{
public:
UltrasoundTarget(/*...*/);
vector<UltrasoundTemplate> getTemplates() { return USTemplateVector_; }
private:
vector<UltrasoundTemplate> USTemplateVector_;
};
FMainWindow.cpp
void FMainWindow::match_slot()
{
int i;
//here I get the name of the target I'm looking for
QTreeWidgetItem *item = targetInfoWidget_->treeWidget->currentItem();
int index = targetInfoWidget_->treeWidget->indexOfTopLevelItem(item);
QString itemToAppendName = item->text(0);
for(i = 0; i < USTargetVector.size(); i++){
if(USTargetVector.at(i).getName() == itemToAppendName) {
//here I try to sort
MyTemplateSort tmpltSrt;
std::sort(USTargetVector.at(i).getTemplates().begin(),
USTargetVector.at(i).getTemplates().end(), tmpltSrt);
break;
}
}
作为示例:我在Volume(0)中定义Template1,在Volume(70)中定义Template2,在Volume(40)中定义Template3。现在的顺序是(Template1,Template2,Template3),但我希望它是(Template1,Template3,Template2)。但是这段代码没有这样做。
如果缺少信息,请告诉我,我将提供更多代码。
非常感谢。
答案 0 :(得分:5)
您的getTemplates()
方法按值返回,这里搞得一团糟:
std::sort(USTargetVector.at(i).getTemplates().begin(),
USTargetVector.at(i).getTemplates().end(), tmpltSrt);
您正在排序不兼容的迭代器范围。您可以通过返回引用来修复该特定问题:
vector<UltrasoundTemplate>& getTemplates() { return USTemplateVector_; }
通常的做法是为这种方法添加const
重载:
const vector<UltrasoundTemplate>& getTemplates() const { return USTemplateVector_; }
您还可以修改比较仿函数以避免不必要的副本(以及一般可读性和常规正确性):
struct MyTemplateSort {
bool operator() const ( const UltrasoundTemplate& t1, const UltrasoundTemplate& t2)
{
return t1.getVolumePos() < t2.getVolumePos();
}
};
这需要您getVolumePos()
const
方法,无论如何都应该这样做:
class UltrasoundTemplate
{
public:
...
int getVolumePos() const { return volume_; }
...
};
请注意,提供对类的私有数据的引用通常不是一种好的做法。如果可能,您应该找到一种从UltraSoundTarget
界面中删除它的方法。例如,您可以公开一对迭代器,和/或为类提供排序方法。
答案 1 :(得分:0)
juanchopanza答案是正确的,问题是你从UltrasoundTarget返回矢量的方式。只是为了触及另一个主题,也许改变一点你的实现设计会很好。由于UltrasoundTarget是Ultrasound的容器,因此将sort作为此类的方法实现是有意义的,这样您就可以直接访问USTemplateVector_并保存不必要的副本。类似的东西:
class UltrasoundTarget
{
public:
UltrasoundTarget(/*...*/);
vector<UltrasoundTemplate> getTemplates() { return USTemplateVector_; }
void sort();
private:
vector<UltrasoundTemplate> USTemplateVector_;
};
void UltrasoundTarget::sort()
{
std::sort(USTemplateVector_.begin(), USTemplateVector_.end(), tmpltSrt);
}
void FMainWindow::match_slot()
{
int i;
//here I get the name of the target I'm looking for
QTreeWidgetItem *item = targetInfoWidget_->treeWidget->currentItem();
int index = targetInfoWidget_->treeWidget->indexOfTopLevelItem(item);
QString itemToAppendName = item->text(0);
for(i = 0; i < USTargetVector.size(); i++){
if(USTargetVector.at(i).getName() == itemToAppendName)
{
//here I try to sort
MyTemplateSort tmpltSrt;
USTargetVector.at(i).sort();
break;
}
}