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

指定されたイテレータの種類を判定するC++プログラムの書き方


イテレータ(iterator)とは、ポインタとよく似たオブジェクトであり、コンテナ内の要素を順番に走査するために使用されます。イテレータを使う最大の利点は、共通のインターフェースを提供できる点にあります。これにより、アルゴリズムが実装に使用されるコンテナの型に依存しない、汎用的な設計が可能になります。

C++標準ライブラリには、以下のような複数のイテレータの種類が存在します。

  • 前方向イテレータ(Forward Iterator)
  • 双方向イテレータ(Bidirectional Iterator)
  • 入力イテレータ(Input Iterator)
  • 出力イテレータ(Output Iterator)
  • ランダムアクセスイテレータ(Random Access Iterator)

本記事で紹介するプログラムは、データ構造が上記のどのイテレータを使用しているのかを判定するものです。

イテレータの種類を判定するための要素

イテレータの種類を特定する際には、次の要素が役立ちます。

  • typeid:実行時に型の識別情報を返す演算子です。
  • iterator_traits:イテレータが持つ性質(特性)を定義するクラステンプレートです。
  • イテレータカテゴリ(iterator category):そのイテレータが属するカテゴリを定義するために使用されます。

これらを組み合わせることで、std::vector のようなコンテナから取得したイテレータが、どのカテゴリに分類されるのかを実行時に判別できます。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
template <class T>
string iteratortype(T iterator){
    if (typeid(typename iterator_traits<T>::iterator_category)
       == typeid(input_iterator_tag))
        return "Input";
    else if (typeid(typename iterator_traits<T>::iterator_category)
       == typeid(output_iterator_tag))
        return "Output";
    else if (typeid(typename iterator_traits<T>::iterator_category)
       == typeid(forward_iterator_tag))
        return "Forward";
    else if (typeid(typename iterator_traits<T>::iterator_category)
       == typeid(bidirectional_iterator_tag))
        return "Bidirectional";
    else if (typeid(typename iterator_traits<T>::iterator_category)
       == typeid(random_access_iterator_tag))
        return "Random_Access";
    return "Missing";
}
int main(){
    vector<int> vec;
    auto iter = vec.begin();
    cout <<iteratortype(iter) << " Iterator\n";
    return 0;
}

実行結果

Random_Access Iterator

コードの解説

このプログラムでは、関数テンプレート iteratortype() を定義し、引数として受け取ったイテレータに対して iterator_traits<T>::iterator_category でカテゴリタグを取得しています。その後、typeid を使って各カテゴリタグ(input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tag)と比較し、一致した名称を文字列として返します。

std::vector のイテレータは連続したメモリ領域へのアクセスが可能なため、最も機能の高い「ランダムアクセスイテレータ」に分類されます。そのため、実行結果には Random_Access Iterator と表示されます。同じ方法は std::list(双方向イテレータ)や std::forward_list(前方向イテレータ)など、他のコンテナに対しても適用できます。


  1. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ

  2. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ