質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

カスタムクラスのvectorをソートしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,188

g_uo

score 208

いつもお世話になります。
オリジナルクラスのvectorをソートしたいです。
float型の変数を基準にしてvectorをソート(昇順)したいのですが、意図した通りに並べ替えられません。

次のサイトを参考に以下の形で実装しています。
Sorting a vector of custom objects

Hogeクラス (ソート対象の自作クラス)

class Hoge
{
public:
  Hoge():float_key_(0.f), int_value_(0){}

  Hoge(const float key, const int value):float_key_(key), int_value_(value){}

  ~Hoge() = default;

  bool operator < (const Hoge& hoge) const
  {
    return (float_key_ < hoge.float_key_);
  }

  float GetKey() const
  {
    return float_key_;
  }

private:
  float float_key_;
  int32_t int_value_;
};

並べ替えおよびテストコード

void TestVectorSort()
{
  std::vector<std::unique_ptr<Hoge>> hoges;

  hoges.push_back(std::make_unique<Hoge>(1.1, 10));
  hoges.push_back(std::make_unique<Hoge>(3.3, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(0.1, 10));
  hoges.push_back(std::make_unique<Hoge>(2.9, 10));
  hoges.push_back(std::make_unique<Hoge>(0.5, 10));

  auto i = 0;

  // Original output
  std::cout << "[Original]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

  // Sort
  std::sort(hoges.begin(), hoges.end());

  // Sorted output
  std::cout << "[Sorted]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

}

実行結果

[Original]
1.100000, 3.300000, 2.200000, 2.200000, 0.100000, 2.900000, 0.500000
[Sorted]
0.100000, 0.500000, 1.100000, 3.300000, 2.200000, 2.200000, 2.900000

希望する実行結果としては以下の並びを期待しています。

[Sorted]
0.100000, 0.500000, 1.100000, 2.200000, 2.200000, 2.900000, 3.300000

解決手法や、私の認識不足をご教示いただきたく、よろしくお願いします。
情報の不足などございましたら、お手数ですがご指摘ください。

 ソース全文

// CppTestProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <string>
#include <memory>
#include <algorithm>

class Hoge
{
public:
  Hoge():float_key_(0.f), int_value_(0){}

  Hoge(const float key, const int value):float_key_(key), int_value_(value){}

  ~Hoge() = default;

  bool operator < (const Hoge& hoge) const
  {
    return (float_key_ < hoge.float_key_);
  }

  float GetKey() const
  {
    return float_key_;
  }

private:
  float float_key_;
  int32_t int_value_;
};

void TestVectorSort()
{
  std::vector<std::unique_ptr<Hoge>> hoges;

  hoges.push_back(std::make_unique<Hoge>(1.1, 10));
  hoges.push_back(std::make_unique<Hoge>(3.3, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(0.1, 10));
  hoges.push_back(std::make_unique<Hoge>(2.9, 10));
  hoges.push_back(std::make_unique<Hoge>(0.5, 10));

  auto i = 0;

  // Original output
  std::cout << "[Original]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

  // Sort
  std::sort(hoges.begin(), hoges.end());

  // Sorted output
  std::cout << "[Sorted]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

}

int main()
{
  TestVectorSort();

  int _;
  std::cin >> _;
    return 0;
}

 補足情報(FW/ツールのバージョンなど)

言語: C++ (VC++ 2017)
開発環境: Windows 10 Pro 64bit
IDE: Visual Studio 2017 v15.7.5

以上、よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

[自己解決]
以下の方法で解決することが出来ました。

  // Sort
  std::sort(hoges.begin(), hoges.end(), [ ](const std::unique_ptr<Hoge>& lhoge, const std::unique_ptr<Hoge>& rhoge)
  {
    return lhoge->GetKey() < rhoge->GetKey();
  });

修正後の実行結果

[Original]
1.100000, 3.300000, 2.200000, 2.200000, 0.100000, 2.900000, 0.500000
[Sorted]
0.100000, 0.500000, 1.100000, 2.200000, 2.200000, 2.900000, 3.300000

次のサイトを参考にしました。
Sorting a vector of unique_ptr's

ラムダを用いた記述方法に変更し、引数をstd::unique_ptr<Hoge>&に変更しました。

お騒がせして申し訳ありません。また、ご回答を記述中だった方がおりましたら、重ねてお詫び申し上げます。

 修正後ソース全文

// CppTestProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <string>
#include <memory>
#include <algorithm>

class Hoge
{
public:
  Hoge():float_key_(0.f), int_value_(0){}

  Hoge(const float key, const int value):float_key_(key), int_value_(value){}

  ~Hoge() = default;

  float GetKey() const
  {
    return float_key_;
  }

private:
  float float_key_;
  int32_t int_value_;
};

void TestVectorSort()
{
  std::vector<std::unique_ptr<Hoge>> hoges;

  hoges.push_back(std::make_unique<Hoge>(1.1, 10));
  hoges.push_back(std::make_unique<Hoge>(3.3, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(2.2, 10));
  hoges.push_back(std::make_unique<Hoge>(0.1, 10));
  hoges.push_back(std::make_unique<Hoge>(2.9, 10));
  hoges.push_back(std::make_unique<Hoge>(0.5, 10));

  auto i = 0;

  // Original output
  std::cout << "[Original]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

  // Sort
  std::sort(hoges.begin(), hoges.end(), [ ](const std::unique_ptr<Hoge>& lhoge, const std::unique_ptr<Hoge>& rhoge)
  {
    return lhoge->GetKey() < rhoge->GetKey();
  });

  // Sorted output
  std::cout << "[Sorted]" << std::endl;
  for (i = 0; i < hoges.size(); i++) {
    if (0 < i) std::cout << ", ";
    std::cout << std::to_string(hoges[i]->GetKey());
  }
  std::cout << std::endl;

}

int main()
{
  TestVectorSort(); 

  int _;
  std::cin >> _;
    return 0;
}

また問題や不明なことがありましたら、お力添えいただければ幸いです。
ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る