○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++