LoginSignup
7
8

More than 5 years have passed since last update.

std::sortを用いて,自作クラスを格納したshared_ptrを格納したstd::vectorのソートを行う

Last updated at Posted at 2014-06-14

アアアアア良い題名にならない!!!

動機

作ってるゲームのクラスが複数情報を持っており,そのvectorを各々の情報でソートしたいけど面倒でござる.

何をどうするんですか

std::sortにvectorのbeginとendと比較用lambdaを叩き込む.
環境はVS2013です.

実際にやってみた

SortTest.cpp
#include <memory>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>

struct SortTarget{
    SortTarget(int num, std::string name){
        _number = num;
        _name = name;
    }
    int _number;
    std::string _name;
};

const int TARGET_SIZE = 5;

void Output(const std::vector<std::shared_ptr<SortTarget>> &targetArray, const std::string &outName){
    std::cout << outName << std::endl;
    for (auto outputData : targetArray){
        std::cout << outputData->_number << ", " << outputData->_name << std::endl;
    }
    std::cout << std::endl;
}

int main(void){
    std::vector<std::shared_ptr<SortTarget>> targetArray;
    std::string nameArray[TARGET_SIZE] = {"aab", "abc", "a", "ac", ""};

    for (int i = 0; i < TARGET_SIZE; i++){
        targetArray.push_back(std::make_shared<SortTarget>(i, nameArray[i]));
    }

    Output(targetArray, "Start");

    std::sort(targetArray.begin(), targetArray.end(), [](const std::shared_ptr<SortTarget> &left, const std::shared_ptr<SortTarget> &right){
        return left->_name.compare(right->_name) < 0;
    });

    Output(targetArray, "NameSort");

    std::sort(targetArray.begin(), targetArray.end(), [](const std::shared_ptr<SortTarget> &left, const std::shared_ptr<SortTarget> &right){
        return left->_number < right->_number;
    });

    Output(targetArray, "NumberSort");

    return 0;
}

出力は

output
Start
0, aab
1, abc
2, a
3, ac
4, 

NameSort
4,
2, a
0, aab
1, abc
3, ac

NumberSort
0, aab
1, abc
2, a
3, ac
4,

となります.

やってることは

  1. _numberと_nameを持つクラスのvectorを作成,
  2. _nameでソート
  3. _numberでソート

で,それぞれの結果を出力しています.

lambdaは正直よくわかってませんが,[]は何か適当に置いておいて,()には比較なので2つのvectorに格納した要素を宣言して,{}で適当な比較を書いてtrueかfalseを返せば良い,という程度の認識で使えました(今回の用途については).

lambda,正直なんだかよくわからぬという印象でしたが,今回使った感じは簡単にソートできて非常に満足しました.

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8