○vectorのソート
sort : クイックソートのため、同じ値同士の順序が維持されません
stable_sort : マージソート、同じ値同士の順序が維持されます
■intのソート
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
int main(){
std::vector<int> data;
data.push_back(5);
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);
std::sort(data.begin(),data.end());//昇順ソート
//std::sort(&data[0],&data[5]);//上と同じ意味
{for(int i=0;i<data.size();i++) printf("%d\n",data[i]);}
printf("\n");
std::sort(data.begin(),data.end(),std::greater<int>());//降順ソート
{for(int i=0;i<data.size();i++) printf("%d\n",data[i]);}
return 0;
}
処理結果
1
2
3
4
5
5
4
3
2
1
■文字列のソート
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
int main(){
std::vector<char*> data;
data.push_back("a");
data.push_back("b");
data.push_back("c");
data.push_back("d");
data.push_back("aa");
std::sort(data.begin(),data.end());//昇順ソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i]);}
printf("\n");
std::sort(data.begin(),data.end(),std::greater<char*>());//降順ソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i]);}
return 0;
}
処理結果
aa
d
c
b
a
a
b
c
d
aa
■構造体のソート
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
struct cell{
int no;
char str[64];
};
bool operator<(const cell& left, const cell& right)
{
return left.no < right.no ;
}
bool operator>(const cell& left, const cell& right)
{
return left.no > right.no ;
}
int main(){
std::vector<cell> data;
cell a;
a.no = 1;strcpy(a.str,"1です");
data.push_back(a);
a.no = 2;strcpy(a.str,"2です");
data.push_back(a);
a.no = 3;strcpy(a.str,"3です");
data.push_back(a);
a.no = 4;strcpy(a.str,"4です");
data.push_back(a);
a.no = 5;strcpy(a.str,"5です");
data.push_back(a);
std::sort(data.begin(),data.end());//昇順ソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i].str);}
printf("\n");
std::sort(data.begin(),data.end(),std::greater<cell>());//降順ソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i].str);}
return 0;
}
処理結果
1です
2です
3です
4です
5です
5です
4です
3です
2です
1です
■構造体のソート2
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
struct cell{
int no;
int no2;
char str[64];
};
bool operator<(const cell& left, const cell& right)
{
return left.no < right.no ;
}
bool compare_no2(const cell& left, const cell& right)
{
return left.no2 < right.no2 ;
}
int main(){
std::vector<cell> data;
cell a;
a.no = 1;a.no2 = 5;strcpy(a.str,".");
data.push_back(a);
a.no = 2;a.no2 = 4;strcpy(a.str,"..");
data.push_back(a);
a.no = 3;a.no2 = 3;strcpy(a.str,"...");
data.push_back(a);
a.no = 4;a.no2 = 2;strcpy(a.str,"....");
data.push_back(a);
a.no = 5;a.no2 = 1;strcpy(a.str,".....");
data.push_back(a);
std::sort(data.begin(),data.end());//昇順ソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i].str);}
printf("\n");
std::sort(data.begin(),data.end(),compare_no2);//比較関数を指定してソート
{for(int i=0;i<data.size();i++) printf("%s\n",data[i].str);}
return 0;
}
処理結果
.
..
...
....
.....
.....
....
...
..
.
▲トップページ
>
Windows と C++