2017年11月24日
《その149》 汎用ユーティリティ関数 qsort & p.117演習3-7
qsort関数
// qsort関数(あらゆる型の配列をソートすることができる。)
// #include <cstdlib>
// @ A B
// ↓ ↓ ↓
// void* qsort(void* base, size_t nmemb, sizt_t size,
// int (*compar)(const void*, const void*));
// ↑
// C 比較関数
・ @は配列の先頭要素へのポインタです。void型として受け取ります。
(void型ポインタは、どのようなポインタ型でも受け取る汎用ポインタ)
・ Aは配列要素の個数です。
・ Bは配列要素の大きさです。
・ 比較関数C 例えば int_cmp を qsort関数に渡す際には、キャストが必要です。
reinterpret_cast<int(*)(const void*, const void*)>(int_cmp);
比較関数は、配列要素の大小の判定方法を qsort関数 に教えます。
比較関数は二つの引数を比較して、第1引数の値が小さければ負の値
を、大きければ正の値を、二つが等しければ 0 を返す仕様にします。
新版明解C++中級編 p.117 演習3-7
qsort関数を用いて、以下の二つの配列を昇順にソートするプログラムを作成せよ。
char a[][7] = {"LISP", "C", "Ada", "Pascal"};
char* p = {"LISP", "C", "Ada", "Pascal"};
ソートを行う部分は、それぞれ独立した関数として実現すること。
// p117_演習3-7
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int acmp(char* x, char* y) { // 比較関数
return strcmp(x, y);
}
int pcmp(char** x, char** y) { // 比較関数
return strcmp(*x, *y);
}
void print_a(char a[][7], int na) {
for (int i = 0; i < na; i++)
cout << a[i] << " ";
cout << '\n';
}
void print_p(const char** p, int np) {
for (int i = 0; i < np; i++)
cout << p[i] << " ";
cout << '\n';
}
int main() {
char a[][7] = { "LISP", "C", "Ada", "Pascal" };
const char* p[] = { "LISP", "C", "Ada", "Pascal" };
int na = sizeof(a) / sizeof(a[0]);
int np = sizeof(p) / sizeof(p[0]);
qsort(a, na, sizeof(a[0]),
reinterpret_cast<int(*)(const void*, const void*)>(acmp));
print_a(a, na);
qsort(p, np, sizeof(p[0]),
reinterpret_cast<int(*)(const void*, const void*)>(pcmp));
print_p(p, np);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7002620
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック