アアアアア良い題名にならない!!!
#動機
作ってるゲームのクラスが複数情報を持っており,その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,
となります.
やってることは
- _numberと_nameを持つクラスのvectorを作成,
- _nameでソート
- _numberでソート
で,それぞれの結果を出力しています.
lambdaは正直よくわかってませんが,[]は何か適当に置いておいて,()には比較なので2つのvectorに格納した要素を宣言して,{}で適当な比較を書いてtrueかfalseを返せば良い,という程度の認識で使えました(今回の用途については).
lambda,正直なんだかよくわからぬという印象でしたが,今回使った感じは簡単にソートできて非常に満足しました.