こんにちは。
C++
1#include <bits/stdc++.h> 2 3 4class MyClass { 5private: 6 int x; 7 8public: 9 MyClass(int _x) 10 : x(_x) { } 11 12 int getX() const { 13 return x; 14 } 15 16 void print() const { 17 std::cout << x << std::endl; 18 } 19}; 20 21bool operator < (const MyClass & a, const MyClass & b) { 22 return a.getX() < b.getX(); 23} 24 25int main() { 26 std::vector<MyClass *> hoge = { 27 new MyClass(56), new MyClass(32), new MyClass(143), new MyClass(14), 28 }; 29 30 std::sort(hoge.begin(), hoge.end()); 31 32 for (const auto h : hoge) { 33 h->print(); 34 } 35 36 for (auto h : hoge) { 37 delete h; 38 } 39}
タイトル通り、以上のようなコードでポインタの配列をソートしたいです。上記のコードをそのまま実行すると std::sort
はアドレスでソートするので、ソート後の hoge
の要素順は未定義かと思います。
これを正しく(14, 32, 56, 143)となるようにソートしたいです。
現状私が知っている方法は
std::function
やラムダ式、関数オブジェクト等を使用して引数がポインタとなっているもの(bool comp(const MyClass * a, const MyClass * b)
)を第3引数のCompare comp
にぶち込む。
なのですが、どれも新たな関数、構造体等を作成しなければならず、コードを複雑化させる要因になります。できれば operator <
だけを利用して、新たな関数、構造体等を作成せずにソートしたいです。
何か方法をご存じでしたら教えてください。お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/06 14:22 編集
2022/07/07 00:04
2022/07/07 01:47
2022/07/17 13:29