sort と merge の使用方法です.
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
bool less_a(int a, int b)
{
return (bool)((a < b) ? 1 : 0);
};
class less_b : public binary_function<int, int, bool>
{
public:
result_type operator() (first_argument_type a, second_argument_type b)
{
return (result_type)((a < b) ? 1 : 0);
}
};
int main()
{
vector<int> v1, v2, v3;
vector<int>::iterator it;
// 初期設定
printf("**初期状態 v1**\n");
v1.push_back(5);
v1.push_back(10);
v1.push_back(4);
v1.push_back(3);
v1.push_back(7);
for (it = v1.begin(); it != v1.end(); it++)
printf(" %d", *it);
printf("\n");
printf("**初期状態 v2**\n");
v2.push_back(1);
v2.push_back(9);
v2.push_back(8);
v2.push_back(6);
v2.push_back(2);
for (it = v2.begin(); it != v2.end(); it++)
printf(" %d", *it);
printf("\n");
// 小さい順にソート
printf("小さい順にソート\n");
sort(v1.begin(), v1.end());
printf(" v1");
for (it = v1.begin(); it != v1.end(); it++)
printf(" %d", *it);
printf("\n");
sort(v2.begin(), v2.end(), less_a);
// 以下の方法でも可能
// sort(v2.begin(), v2.end(), less_b());
// sort(v2.begin(), v2.end(), less<int>());
printf(" v2");
for (it = v2.begin(); it != v2.end(); it++)
printf(" %d", *it);
printf(" (比較関数を使用)\n");
// v1 と v2 をマージ
printf("v1 と v2 をマージ\n");
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v3, v3.begin()));
// 以下の方法でも可能
// merge(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v3, v3.begin()), less_a);
// merge(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v3, v3.begin()), less_b());
// merge(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v3, v3.begin()), less<int>());
for (it = v3.begin(); it != v3.end(); it++)
printf(" %d", *it);
printf("\n");
return 0;
}
(出力)
**初期状態 v1**
5 10 4 3 7
**初期状態 v2**
1 9 8 6 2
小さい順にソート
v1 3 4 5 7 10
v2 1 2 6 8 9 (比較関数を使用)
v1 と v2 をマージ
1 2 3 4 5 6 7 8 9 10
sort と stable_sort 使用方法です.2 つの方法の違いが分かるような方法が見つかりませんでした.
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
bool less_a(pair<int,int> a, pair<int,int> b)
{
return (bool)((a.first < b.first) ? 1 : 0);
};
class less_b : public binary_function<pair<int,int>, pair<int,int>, bool>
{
public:
result_type operator() (first_argument_type a, second_argument_type b)
{
return (result_type)((a.first < b.first) ? 1 : 0);
}
};
int main()
{
vector<pair<int, int> > v1, v2;
vector<pair<int, int> >::iterator it;
// 初期設定
printf("**初期状態 v1**\n");
v1.push_back(pair<int, int>(3,10));
v1.push_back(pair<int, int>(2,22));
v1.push_back(pair<int, int>(2,21));
v1.push_back(pair<int, int>(3,30));
v1.push_back(pair<int, int>(2,20));
for (it = v1.begin(); it != v1.end(); it++)
printf(" (%d, %d)", it->first, it->second);
printf("\n");
printf("**初期状態 v2**\n");
v2 = v1;
for (it = v2.begin(); it != v2.end(); it++)
printf(" (%d, %d)", it->first, it->second);
printf("\n");
// 小さい順にソート(v1, sort)
printf("小さい順にソート(v1, sort)\n");
sort(v1.begin(), v1.end(), less_a);
// 以下の方法でも可能
// sort(v1.begin(), v1.end(), less_b());
for (it = v1.begin(); it != v1.end(); it++)
printf(" (%d, %d)", it->first, it->second);
printf("\n");
// 小さい順にソート(v2, stable_sort)
printf("小さい順にソート(v2, stable_sort)\n");
stable_sort(v2.begin(), v2.end(), less_a);
// 以下の方法でも可能
// stable_sort(v2.begin(), v2.end(), less_b());
for (it = v2.begin(); it != v2.end(); it++)
printf(" (%d, %d)", it->first, it->second);
printf("\n");
return 0;
}
(出力)
**初期状態 v1**
(3, 10) (2, 22) (2, 21) (3, 30) (2, 20)
**初期状態 v2**
(3, 10) (2, 22) (2, 21) (3, 30) (2, 20)
小さい順にソート(v1, sort)
(2, 22) (2, 21) (2, 20) (3, 10) (3, 30)
小さい順にソート(v2, stable_sort)
(2, 22) (2, 21) (2, 20) (3, 10) (3, 30)