用于访问向量的通用迭代器

时间:2012-11-16 09:24:41

标签: c++ iterator stdvector

我想知道我是否可以使用通用迭代器来访问向量中的元素。我有不同的向量,但只有一个功能来显示元素。 如果我可以有一个通用的迭代器,那么我的方法可以顺利运行。如果有可能请提供建议。

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

2 个答案:

答案 0 :(得分:5)

您可以通过vectoriterator访问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;
    }
}

请注意,我更改了签名以获取const引用而不是值。使用原始签名,每次调用函数时都会不必要地复制向量。

或者,您可以实现该函数以获取两个迭代器:

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

并将其称为:

Display(v.begin(), v.end());

答案 1 :(得分: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;
}