2017-06-22 24 views
8

Một thuật toán tiêu chuẩn đặc biệt hữu ích là std::equal, được định nghĩa như sau:C++ STL thuật toán bằng

template <typename InputIterator1, typename InputIterator2> 
inline bool equal(InputIterator1 start1, 
InputIterator1 end1, 
InputIterator2 start2) 
{ 
    while(start1 != end1) 
    { 
     if(*start1 != *start2) return false; 
     ++start1; 
     ++start2; 
    } 
    return true; 
} 

Thuật toán đi qua phạm vi xác định bởi [start1, end1)[start2, start2 + (end1 – start1)) và lợi nhuận cho dù các yếu tố trong phạm vi đều bình đẳng . Lưu ý rằng thuật toán được templatized trên hai loại khác nhau của vòng lặp đầu vào.

Tại sao điều này?

+3

Để bạn có thể muốn so sánh nội dung từ các vùng chứa khác nhau, làm ví dụ. – skypjack

Trả lời

5

Nó được tạo khuôn mẫu theo cách này để bạn có thể vượt qua hai vòng lặp cùng loại hoặc hai trình lặp với các loại khác nhau.



Ví dụ:

vector<int> a; //some stuff 
list<int> b; //some stuff 
equal(a.begin(), a.end(), b.begin()); 
/* 
Here InputIterator1 is a vector<int>::iterator 
and InputIterator2 is a list<int>::iterator 
*/ 

vector<double> c; //some stuff 
vector<double> d; //some stuff 
equal(c.begin(), c.end(), d.begin()); 
/* 
Here InputIterator1 is a vector<double>::iterator 
and InputIterator2 is also a vector<double>::iterator 
*/ 
12

phép nói rằng bạn có một std::list<int>std::vector<int> và muốn xem họ đều bình đẳng. Nếu std::equal không sử dụng các loại trình lặp khác nhau, bạn không thể sử dụng nó từ std::list<int>::iterator không phải là loại tương tự như std::vector<int>::iterator.

Điều này cũng áp dụng cho cùng loại vùng chứa nhưng lưu trữ các phần tử khác nhau. A std::vector<int>::iterator không giống như std::vector<long long>::iterator và vì vậy bạn sẽ không thể so sánh các giá trị này nếu nó sử dụng cùng loại cho cả hai cặp lặp.

+0

Đó không chỉ là các vùng chứa khác nhau có thể được cung cấp - bạn có thể so sánh ví dụ: 'vector ' tới 'vectơ '. –

+0

@MarkRansom Tôi cũng sẽ thêm nó vào. – NathanOliver

+0

Nghiêng độc đáo. Rất tiếc, tôi không thể cung cấp cho bạn +1 thứ hai. –

8

Cho đến nay, bạn đã nhận được hai câu trả lời tập trung vào các vùng chứa. Đó là sự tập trung sai. Sự trừu tượng hóa dữ liệu cơ bản trong STL là trình tự. Một chuỗi được định nghĩa bởi một cặp vòng lặp. Thùng chứa là một cách để quản lý chuỗi, nhưng chúng không phải là cách duy nhất. Vì vậy, để cung cấp cho ngay < g> câu trả lời:

std::equal so sánh hai trình tự cho sự bình đẳng. Không có lý do chính đáng nào để hạn chế việc áp dụng thuật toán cho các chuỗi có cùng loại trình lặp, do đó không có giới hạn như vậy. Các chuỗi có thể có nguồn gốc khác nhau và có thể tham chiếu đến các loại giá trị khác nhau. Ví dụ, bạn có thể muốn kiểm tra xem các giá trị được biểu diễn trong tệp có chứa văn bản represention của các giá trị kép giống hệt với nội dung của một vectơ các số nguyên được lưu trữ trong bộ nhớ hay không. Vector định nghĩa một chuỗi; bạn có thể nhận được tại các vòng lặp của nó với begin()end(). Tệp định nghĩa một chuỗi; bạn có thể lấy các trình vòng lặp của nó bằng cách mở tệp với một ifstream và tạo một cặp đối tượng istream_iterator<double>. std::equal (và tất cả các thuật toán chuẩn còn lại) sẽ hoạt động tốt với các nguồn dữ liệu khác nhau và các kiểu dữ liệu khác nhau của chúng.

Các vấn đề liên quan