2012-11-16 6 views
5

Chciałbym wiedzieć, czy mogę mieć ogólny iterator dostępu do elementów w wektorach. Mam dla różnych wektorów, ale tylko jedną funkcję do wyświetlania elementów. Jeśli mogę mieć ogólny iterator, niż moja metoda może działać sprawnie. Proszę o poradę, jeśli to możliwe.Ogólne Iteratory dostępu do wektorów

Punkt 2, punkt 3, wiersz 2, wiersz 3 to 4 różne klasy. Metoda przyjmuje obiekt wektorowy, który utworzyłem w innej metodzie.

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

To, co kiedyś robiłem, było łatwiejsze do znalezienia. Teraz trzeba wdrożyć za pomocą iteratorów

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

Która wersja C++ używacie? –

+0

@DenisErmolin Basic Myślę, że .. Ale jestem pewien, że nie używam C++ 11 –

+0

@DenisErmolin Jestem nowy w C++, więc nie jestem pewien, jak znaleźć –

Odpowiedz

5

można mieć dostęp do vector „s typów iterator poprzez iterator i const_iterator, więc nie wymagają przełączania:

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

pamiętać, że zmienił podpis pobiera odwołanie do const, a nie do wartości. Dzięki oryginalnemu podpisowi niepotrzebnie kopiowałbyś wektor za każdym razem, gdy wywołasz funkcję.

Alternatywnie, można zaimplementować funkcję wziąć dwa iteratory:

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

i nazwać tak:

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

Twój kod daje mi kilka błędów. Mówi "VectorObject" nie został zadeklarowany –

+1

@ user1571494 przepraszam, miałem literówkę, 'VectorObject' zamiast' VecObject'. Naprawiłem to teraz. – juanchopanza

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

Załóżmy, że VectorObject realizuje iteratorów można uzyskać dostęp do jego iterator wpisz bezpośrednio.

Zastosowanie:

int main() 
{ 
    std::vector<int> intv(2, 5); 
    std::vector<float> fv(2, 10); 
    Display(intv); 
    Display(fv); 
    return 0; 
}