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

C++の演算子オーバーロードでvector・map・pairの中身を簡単に出力する方法


本記事では、C++の演算子オーバーロードを活用して、vectormappair の中身を std::cout で手軽に出力する方法を解説します。

演算子オーバーロードとは、既存の演算子に対してユーザー定義型向けの動作を定義できるC++の機能です。これにより、組み込み型と同じような自然な記述でオブジェクトを扱えるようになります。特にストリーム出力に使う << 演算子をオーバーロードしておけば、コンテナの中身を1行のコードで整形して表示でき、デバッグ作業が格段に楽になります。

実装例

1. vector の内容を出力する

テンプレート関数として operator<< を定義すれば、任意の要素型を持つ vector に対応できます。以下の例では、要素を角括弧で囲み、カンマ区切りで出力しています。

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    os << "[";
    for (int i = 0; i < v.size(); ++i) {
        os << v[i];
        if (i != v.size() - 1)
            os << ", ";
    }
    os << "]\n";
    return os;
}

int main() {
    vector<int> vec{ 4, 2, 17, 11, 15 };
    cout << vec;
    return 0;
}

実行結果:

[4, 2, 17, 11, 15]

2. map の内容を出力する

map はキーと値のペアを保持するコンテナです。範囲ベースfor文で各要素を走査し、first(キー)と second(値)を「キー : 値」の形式で出力します。

#include <iostream>
#include <map>
using namespace std;

template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v) {
    for (auto it : v)
        os << it.first << " : "
           << it.second << "\n";
    return os;
}

int main() {
    map<char, int> mp;
    mp['b'] = 3;
    mp['d'] = 5;
    mp['a'] = 2;
    cout << mp;
}

実行結果:

a : 2
b : 3
d : 5

map はキーの昇順で自動的にソートされるため、挿入順序に関係なく a → b → d の順に出力されている点にも注目してください。

3. pair の内容を出力する

pairfirstsecond の2つのメンバを持つため、それらを丸括弧で囲んで出力します。

#include <iostream>
using namespace std;

template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
    os << "(";
    os << v.first << ", "
       << v.second << ")";
    return os;
}

int main() {
    pair<int, int> pi{ 45, 7 };
    cout << pi;
    return 0;
}

実行結果:

(45, 7)

まとめ

operator<< をテンプレート関数としてオーバーロードすれば、vectormappair といった標準コンテナの中身を、cout << obj; のように直感的な構文で出力できます。競技プログラミングやデバッグ時に非常に便利なテクニックなので、ぜひ活用してみてください。

  1. C++で区間を挿入する方法:重なる区間のマージアルゴリズムを解説

    問題概要互いに重ならない区間(インターバル)の集合が与えられます。この集合に対して新しい区間を挿入し、必要であれば重なる区間をマージ(統合)して結果を求めます。例えば、既存の区間が [[1,4],[6,9]] で、挿入する新しい区間が [2,5] の場合、出力は [[1,5],[6,9]] となります。新しい区間 [2,5] は既存の区間 [1,4] と重なっているため、両者が統合されて [1,5] になるからです。アルゴリズムの流れこの問題は、以下の手順で解くことができます。新しい区間を既存の区間リストの末尾に追加する区間の開始位置を基準にリスト全体をソートする(n は区間の総数)結果を格納

  2. C++で二分木を見やすい形式で2次元配列に出力する方法

    本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ