Общие итераторы для доступа к векторам

Я хотел бы знать, могу ли я иметь общий итератор для доступа к элементам в векторах. У меня есть разные векторы, но только одна функция для отображения элементов. Если бы у меня был общий итератор, мой метод мог бы работать гладко. Посоветуйте, если это возможно.

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];
// }

person M.A    schedule 16.11.2012    source источник
comment
Какую версию С++ вы используете?   -  person Denis Ermolin    schedule 16.11.2012
comment
@DenisErmolin Basic, я думаю.. Но я уверен, что не использую С++ 11   -  person M.A    schedule 16.11.2012
comment
@DenisErmolin Я новичок в С++, поэтому не знаю, как найти   -  person M.A    schedule 16.11.2012


Ответы (2)


У вас есть доступ к типам итераторов vector через iterator и const_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;
    }
}

Обратите внимание, что я изменил сигнатуру, чтобы использовать константную ссылку, а не значение. С исходной сигнатурой вы бы без необходимости копировали вектор каждый раз, когда вызываете функцию.

В качестве альтернативы вы можете реализовать функцию для двух итераторов:

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

и назовите это так:

Display(v.begin(), v.end());
person juanchopanza    schedule 16.11.2012
comment
Ваш код выдает кучу ошибок. Он говорит, что «VectorObject» не был объявлен - person M.A; 16.11.2012
comment
@user1571494 user1571494 извините, у меня опечатка, VectorObject вместо VecObject. Я исправил это сейчас. - person juanchopanza; 16.11.2012

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;
}
person Denis Ermolin    schedule 16.11.2012