3

「UltrasoundTemplate」というクラスがあります。これらの UltrasoundTemplate オブジェクトには int パラメーターが含まれており、いつ定義されたかを示します (タイム スタンプのようなもの)。UltrasoundTemplate のベクトルを含む「UltrasoundTarget」というクラスがあります。push_back(ultrasoundTemplate) を使用して UltrasoundTemplates をベクターに追加します。

ここで、ベクトルに追加した順序ではなく、タイム スタンプの順序でベクトルを並べ替えたいと思います。

私はグーグルで多くの答えを見つけましたが、それらはすべて同じ解決策を示していますが、明らかに私はまだ何か間違ったことをしています。解決策を見つけるために必要だと思うコードスニペットを次に示します。

超音波テンプレート.h

class UltrasoundTemplate
{
public:
 UltrasoundTemplate(/*...*/);
 int getVolumePos() { return volume_; }
private:
 int volume_;
};

超音波ターゲット.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) にしたいです。しかし、このコードはそれを行っていません。

情報が不足している場合は、教えてください。さらにコードを提供します。

どうもありがとう。

4

2 に答える 2

0

juanchopanza の答えは正しいです。問題は、UltrasoundTarget からベクトルを返す方法です。別のトピックに触れるだけですが、実装の設計を少し変更するとよいでしょう。UltrasoundTarget は Ultrasound のコンテナーであるため、このクラスのメソッドとして並べ替えを実装することは理にかなっています。これにより、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;
 }
}
于 2013-09-30T13:41:01.663 に答える