5

ベクトル内の要素にアクセスするための汎用イテレータを使用できるかどうかを知りたいです。さまざまなベクトルがありますが、要素を表示する関数は 1 つだけです。ジェネリック イテレータを使用できる場合、メソッドはスムーズに機能します。可能でしたらアドバイスお願いします。

Point2、Point3、Line2、Line3 は 4 つの異なるクラスです。このメソッドは、別のメソッドで作成したベクター オブジェクトを取り込みます。

template <typename VecObject>
void Display(VecObject v) {

    if (filterCriteria == "Point2") {
        vector<Point2>::iterator it;
    } else if (filterCriteria == "Point3") {

    } else if (filterCriteria == "Line2") {

    } else if (filterCriteria == "Line3") {

    }

    for ( it = v.begin(); it!=v.end(); ++it) {
        cout << *it << endl;
    }
}

これは私が以前に行っていたことであり、うまく機能します。イテレータを使用して実装する必要があります

//for (int i = 0; i < v.size(); i++) {
// cout << v[i];
// }
4

2 に答える 2

5

vectorを介して a のイテレータ型にアクセスできるため、切り替える必要はありません。iteratorconst_iterator

template <typename VecObject>
void Display(const VecObject& v) {
    typename VecObject::const_iterator it;
    for ( it = v.begin(); it!=v.end(); ++it) {
        cout << *it << endl;
    }
}

値ではなく const 参照を取るように署名を変更したことに注意してください。元の署名では、関数を呼び出すたびにベクターを不必要にコピーすることになります。

または、関数を実装して 2 つの反復子を受け取ることができます。

template <typename Iterator>
void Display(Iterator first, Iterator last) {
    for (Iterator it = first; it!=last; ++it) {
        cout << *it << endl;
    }
}

次のように呼び出します。

Display(v.begin(), v.end());
于 2012-11-16T09:31:31.023 に答える
3
template<typename VectorObject>
void Display(VecObject v) {
   typename VectorObject::const_iterator it = v.begin();
   for (; it!=v.end(); ++it) {
      cout << *it << endl;
   }
}

その型に直接VectorObjectアクセスできるイテレータを実装していると仮定します。iterator

使用法:

int main()
{
  std::vector<int> intv(2, 5);
  std::vector<float> fv(2, 10);
  Display(intv);
  Display(fv);
  return 0;
}
于 2012-11-16T09:31:57.247 に答える