std::equal
#include <algorithm>
// So sánh bằng toán tử ==
template <class InputIterator1, class InputIterator2>
bool equal (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2);
// Sử dụng hàm vị từ so sánh
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred);
Kiểm tra xem hai phạm vi (range) có bằng nhau hay không, nghĩa là chúng có cùng số lượng phần tử và các phần tử tương ứng đều khớp với nhau.
Tham số
first1
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi thứ nhất.
last1
- Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi thứ nhất. Phạm vi thứ nhất là
[first1, last1)
.
first2
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi thứ hai.
pred
- Một hàm vị từ (binary predicate) nhận hai đối số (một phần tử từ phạm vi thứ nhất và một phần tử từ phạm vi thứ hai) và trả về true nếu hai phần tử được coi là khớp, false nếu không. (Phiên bản 2)
Giá trị trả về
true
- Nếu hai phạm vi bằng nhau, tức là:
- Phạm vi thứ hai phải chứa ít nhất số phần tử như phạm vi thứ nhất
- Tất cả các phần tử tương ứng trong hai phạm vi đều khớp nhau (theo toán tử
==
hoặc theo hàm vị từpred
).
false
- Nếu hai phạm vi không bằng nhau (độ dài khác nhau hoặc có ít nhất một cặp phần tử tương ứng không khớp).
Đặc điểm
- Phạm vi thứ hai (
first2
đến hết) phải chứa ít nhất số phần tử bằng phạm vi thứ nhất. Nếu phạm vi thứ hai ngắn hơn, kết quả sẽ không như bạn mong đợi. (Ví dụ 4) - Phạm vi
[first1, last1)
là "nửa mở", không bao gồm phần tửlast1
. - Phiên bản 1 của
equal()
sử dụng toán tử==
để so sánh các phần tử. Phiên bản 2 cho phép bạn tùy chỉnh cách so sánh bằng hàm vị từ. - Để so sánh hai phạm vi có độ dài khác nhau, bạn nên kiểm tra độ dài của chúng trước khi sử dụng
equal()
. Hoặc có thể sử dụngmismatch()
để tìm điểm không khớp. equal()
thường được sử dụng để:- Kiểm tra xem hai container có nội dung giống nhau hay không.
- Xác minh xem một phần của container có khớp với một mẫu cho trước hay không.
- So sánh dữ liệu từ hai nguồn khác nhau để đảm bảo tính nhất quán.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
// Hàm vị từ so sánh hai ký tự (không phân biệt hoa thường)
bool caseInsensitiveCompare(char a, char b) {
return std::tolower(a) == std::tolower(b);
}
int main() {
std::vector<int> numbers1 = {1, 2, 3, 4, 5};
std::vector<int> numbers2 = {1, 2, 3, 4, 5};
std::vector<int> numbers3 = {1, 2, 9, 4, 5};
std::vector<int> numbers4 = {1, 2, 3};
// Phiên bản 1: So sánh numbers1 và numbers2
if (std::equal(numbers1.begin(), numbers1.end(), numbers2.begin())) {
std::cout << "numbers1 and numbers2 are equal.\n";
} else {
std::cout << "numbers1 and numbers2 are not equal.\n";
}
// Phiên bản 1: So sánh numbers1 và numbers3
if (std::equal(numbers1.begin(), numbers1.end(), numbers3.begin())) {
std::cout << "numbers1 and numbers3 are equal.\n";
} else {
std::cout << "numbers1 and numbers3 are not equal.\n";
}
// Phiên bản 1: So sánh numbers1 và numbers4 (độ dài khác nhau)
if (std::equal(numbers1.begin(), numbers1.end(), numbers4.begin())) {
std::cout << "numbers1 and numbers4 are equal.\n";
} else {
std::cout << "numbers1 and numbers4 are not equal.\n";
}
// Phiên bản 1: So sánh numbers4 và numbers1 (numbers4 ngắn hơn)
if (std::equal(numbers4.begin(), numbers4.end(), numbers1.begin())) {
std::cout << "numbers4 and numbers1 are equal.\n";
} else {
std::cout << "numbers4 and numbers1 are not equal.\n";
}
std::string str1 = "Hello";
std::string str2 = "hello";
// Phiên bản 2: So sánh str1 và str2 (không phân biệt hoa thường)
if (std::equal(str1.begin(), str1.end(), str2.begin(), caseInsensitiveCompare)) {
std::cout << "str1 and str2 are equal (case-insensitive).\n";
} else {
std::cout << "str1 and str2 are not equal (case-insensitive).\n";
}
return 0;
}
Các hàm liên quan
mismatch | So sánh hai phạm vi và tìm vị trí đầu tiên mà các phần tử tương ứng không khớp |
find_first_of | Tìm kiếm phần tử đầu tiên trong một phạm vi mà phần tử đó khớp với bất kỳ phần tử nào trong một phạm vi khác |
find_end | Tìm kiếm sự xuất hiện cuối cùng của một dãy con trong một phạm vi khác |
search | Tìm kiếm sự xuất hiện đầu tiên của một dãy con trong một phạm vi lớn hơn |