C++
 Computer >> コンピューター >  >> プログラミング >> C++

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など、他の連想コンテナでも同様の手法が使えるので、覚えておくと便利です。

  1. C++で解く対角トラバースII:リストのリストを対角順に出力する方法

    問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す

  2. Windows 10でスクロール方向を反転させる3つの方法

    Windowsユーザーは大きく分けて2つのタイプに分けられます。標準のスクロール方向を使う人と、逆スクロールを好む人です。筆者は標準派ですが、「逆スクロールの方が自然」と感じる人も決して少なくありません。かつてはスクロール方向の反転はスイッチ一つで簡単に切り替えられました。しかしMicrosoftは最新のWindows 10アップデートで仕様を変更し、デバイス > マウスとタッチパッドから「スクロール方向を反転する」をワンクリックで切り替えることはできなくなりました。とはいえ、あきらめる必要はありません。多少手間はかかりますが、今でもスクロール方向を反転させる方法は存在します。調査の結果、最新