C++のset(集合)を逆順に走査する方法
C++のstd::setは、要素が自動的に昇順ソートされて格納される連想コンテナです。本記事では、このsetを逆順(降順)に走査する方法を解説します。
例えば、次のようなsetがあるとします。
S = [10, 15, 26, 30, 35, 40, 48, 87, 98]
これを逆順に走査した場合の出力は、以下のようになります。
98 87 48 40 35 30 26 15 10
reverse_iteratorを使った逆順走査
setを逆順に走査するには、リバースイテレータ(reverse_iterator)を使用します。通常のbegin()・end()の代わりに、以下の2つのメンバ関数を利用します。
rbegin():逆イテレータの先頭(=コンテナの最後の要素)を返すrend():逆イテレータの末尾(=コンテナの最初の要素の直前)を返す
つまり、rbegin()からrend()へ向かってイテレータを進めることで、要素を後ろから前へと順番に処理できます。
サンプルコード
#include <iostream>
#include <set>
using namespace std;
int main() {
int arr[] = {10, 15, 26, 30, 35, 40, 48, 87, 98};
set<int> my_set(arr, arr + sizeof(arr) / sizeof(arr[0]));
set<int>::iterator it;
cout << "Elements of Set in forward order: ";
for (it = my_set.begin(); it != my_set.end(); it++)
cout << *it << " ";
set<int>::reverse_iterator rev_it;
cout << "\nElements of Set in reverse order: ";
for (rev_it = my_set.rbegin(); rev_it != my_set.rend(); rev_it++)
cout << *rev_it << " ";
return 0;
}実行結果
Elements of Set in forward order: 10 15 26 30 35 40 48 87 98 Elements of Set in reverse order: 98 87 48 40 35 30 26 15 10
コードのポイント
- 前方走査:
begin()〜end()を通常のイテレータでループし、昇順に要素を出力します。 - 後方走査:
rbegin()〜rend()をreverse_iterator型でループし、降順に要素を出力します。 - イテレータの宣言は
autoキーワード(C++11以降)を使うと、より簡潔に記述できます。
このように、rbegin()とrend()を組み合わせるだけで、setの要素を簡単に逆順に処理できます。mapやmultisetなど、他の連想コンテナでも同様の手法が使えるので、覚えておくと便利です。
-
C++で解く対角トラバースII:リストのリストを対角順に出力する方法
問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す
-
Windows 10でスクロール方向を反転させる3つの方法
Windowsユーザーは大きく分けて2つのタイプに分けられます。標準のスクロール方向を使う人と、逆スクロールを好む人です。筆者は標準派ですが、「逆スクロールの方が自然」と感じる人も決して少なくありません。かつてはスクロール方向の反転はスイッチ一つで簡単に切り替えられました。しかしMicrosoftは最新のWindows 10アップデートで仕様を変更し、デバイス > マウスとタッチパッドから「スクロール方向を反転する」をワンクリックで切り替えることはできなくなりました。とはいえ、あきらめる必要はありません。多少手間はかかりますが、今でもスクロール方向を反転させる方法は存在します。調査の結果、最新