2012-11-16 28 views
5

Tôi muốn biết liệu tôi có thể có một bộ lặp chung để truy cập các phần tử trong các vectơ hay không. Tôi có các vector khác nhau nhưng chỉ có một hàm để hiển thị các phần tử. Nếu tôi có thể có một trình lặp chung chung hơn là phương pháp của tôi có thể hoạt động trơn tru. Xin hãy tư vấn nếu có thể.Các bộ lặp chung để truy cập các vectơ

Point2, Point3, Line2, Line3 là 4 lớp khác nhau. Phương thức này lấy một đối tượng vector mà tôi đã tạo trong một phương thức khác.

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

Điều mà tôi thường làm và tìm được. bây giờ tôi cần phải thực hiện sử dụng vòng lặp

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

Phiên bản nào của C++ để bạn sử dụng? –

+0

@DenisErmolin Basic Tôi nghĩ .. Nhưng tôi chắc chắn tôi không sử dụng C++ 11 –

+0

@DenisErmolin Tôi mới dùng C++ vì vậy tôi không chắc chắn cách tìm kiếm –

Trả lời

5

Bạn có thể vào vector của loại iterator qua iteratorconst_iterator, vì vậy bạn không cần chuyển đổi:

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

Lưu ý rằng tôi đã thay đổi chữ ký để tham chiếu const so với giá trị. Với chữ ký gốc, bạn sẽ không cần sao chép vectơ mỗi khi bạn gọi hàm.

Ngoài ra, bạn có thể thực hiện các chức năng để mất hai lặp:

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

và gọi nó là như thế này:

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

Mã của bạn đang cho tôi một loạt lỗi. Nó nói ‘VectorObject’ chưa được khai báo là –

+1

@ user1571494 xin lỗi, tôi có lỗi đánh máy, 'VectorObject' thay vì' VecObject'. Tôi đã sửa nó ngay bây giờ. – juanchopanza

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

Giả sử rằng VectorObject bạn thực hiện vòng lặp bạn có thể truy cập vào nó iterator nhập trực tiếp.

Cách sử dụng:

int main() 
{ 
    std::vector<int> intv(2, 5); 
    std::vector<float> fv(2, 10); 
    Display(intv); 
    Display(fv); 
    return 0; 
} 
Các vấn đề liên quan