C++でIPアドレスをソートする

さっと検索した範囲だとサンプルが見つからず、単純だけど自分で作ったのでメモ。例によって力技。数値変換せずに文字列比較だけ(ユニコード前提)。

データは、他の自サイトに最近1ヵ月ほどでアクセスのあったGooglebotやGoogleの他サービスのIPアドレス。(ちなみにいずれも全リストが公開されている。Googlebot / 他サービス使用IP。参照した記事はこちら )

比較関数

まず比較関数を用意する。とりあえず、よく使うstd::wstring版。(不正な文字列とかの対策は足りないかも)

(降順ソートは比較を逆にするだけ。)

テストコード

出力結果

64.233.172.180
66.102.8.152
66.102.8.158
66.249.64.152
66.249.66.86
66.249.68.1
66.249.68.5
66.249.68.6
66.249.68.9
66.249.68.13
66.249.68.17
66.249.68.20
66.249.68.21
66.249.68.24
66.249.68.25
66.249.68.28
66.249.68.30
66.249.72.239
66.249.72.241
66.249.72.243
66.249.74.16
66.249.79.20
66.249.79.133
66.249.79.135
66.249.79.137
66.249.79.139
66.249.79.141
66.249.79.143
66.249.79.145
66.249.79.147
66.249.79.153
66.249.82.16
66.249.82.18
66.249.82.20
66.249.82.26
66.249.82.28
66.249.82.30
66.249.82.176
66.249.82.178
66.249.82.180
66.249.82.186
66.249.82.188
66.249.82.190
66.249.83.17
66.249.83.19
66.249.83.21
66.249.88.40
66.249.88.42
66.249.88.44
66.249.88.45
66.249.88.46
66.249.88.47
72.14.199.68
72.14.199.70
72.14.199.72
72.14.199.73
72.14.199.76
72.14.199.77
72.14.199.79
72.14.199.80
72.14.201.152
72.14.201.153
74.125.150.1
74.125.150.19
74.125.150.20
74.125.150.23
74.125.150.24
74.125.150.25
74.125.150.27
74.125.150.28
74.125.150.31
74.125.212.235
74.125.212.237
74.125.212.239
74.125.212.241
74.125.212.243
74.125.214.16
74.125.214.18
74.125.214.20
74.125.214.26
107.178.234.23
107.178.234.85
107.178.234.88
107.178.234.92
107.178.234.144
107.178.234.147
107.178.234.155
107.178.234.156
107.178.234.158
130.211.54.158
193.186.4.134
193.186.4.152
193.186.4.153

汎用版

これだけだと芸がないので、stringとかu16stringとか一通りの文字列型に対応する汎用版。
関数テンプレートの特殊化ってこういう使い方でいいのかよく分かってないが。
区切り文字の取得以外は、前のコードとほぼ同じ。

呼び出しはこんな感じ。

区切りの文字定数取得は、c++14以降だとbasic_string_viewを使ってもう少しすっきり出来るらしい。

C++Builder10.2.3 / Windows10(22H2)で確認。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です