std::adjacent_find
#include <algorithm>
// So sánh bằng toán tử ==
template <class ForwardIterator>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
// Sử dụng hàm vị từ so sánh
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,
BinaryPredicate pred);
Tìm kiếm cặp phần tử liên tiếp (adjacent) đầu tiên trong một phạm vi (range) mà hai phần tử đó thỏa mãn một điều kiện nhất định (mặc định là bằng nhau).
Tham số
first
- Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi cần tìm kiếm.
last
- Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần tìm kiếm. Phạm vi tìm kiếm bao gồm từ
first
đếnlast
nhưng không bao gồmlast
([first, last)
).
pred
- Một hàm vị từ (binary predicate) nhận hai đối số (hai phần tử liên tiếp trong phạm vi) và trả về true nếu chúng thỏa mãn điều kiện, false nếu không. (Phiên bản 2)
Giá trị trả về
- Iterator trỏ đến phần tử đầu tiên trong cặp phần tử liên tiếp đầu tiên thỏa mãn điều kiện.
- Nếu không tìm thấy cặp phần tử liên tiếp nào thỏa mãn điều kiện trong phạm vi, hàm trả về
last1
.
Đặc điểm
adjacent_find()
chỉ tìm kiếm cặp phần tử liên tiếp thỏa mãn điều kiện.- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. - Phiên bản 1 của
adjacent_find()
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ừ. - Forward Iterator cần thiết cho
adjacent_find()
phải hỗ trợ di chuyển một lần (single-pass). adjacent_find()
thường được sử dụng để:- Tìm các phần tử trùng lặp liên tiếp trong một dãy.
- Kiểm tra xem một dãy có được sắp xếp theo một thứ tự nhất định hay không (bằng cách sử dụng hàm vị từ so sánh phù hợp).
- Tìm các điểm thay đổi đột ngột trong dữ liệu (ví dụ: tìm điểm mà giá trị thay đổi từ dương sang âm).
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
// Hàm vị từ kiểm tra xem hai số liên tiếp có cùng tính chẵn lẻ hay không
bool sameParity(int a, int b) {
return (a % 2) == (b % 2);
}
int main() {
std::vector<int> numbers1 = {1, 2, 3, 3, 4, 5, 6, 6, 6, 7};
std::vector<int> numbers2 = {1, 3, 5, 7, 9, 2, 4, 6, 8};
// Phiên bản 1: Tìm cặp phần tử trùng lặp liên tiếp đầu tiên
std::vector<int>::iterator it1 = std::adjacent_find(numbers1.begin(), numbers1.end());
if (it1 != numbers1.end()) {
std::cout << "First pair of equal adjacent elements: " << *it1 << " and " << *(it1 + 1) << " at position: " << (it1 - numbers1.begin()) << std::endl;
} else {
std::cout << "No equal adjacent elements found.\n";
}
// Phiên bản 2: Tìm cặp phần tử liên tiếp đầu tiên có cùng tính chẵn lẻ
std::vector<int>::iterator it2 = std::adjacent_find(numbers2.begin(), numbers2.end(), sameParity);
if (it2 != numbers2.end()) {
std::cout << "First pair of adjacent elements with same parity: " << *it2 << " and " << *(it2 + 1) << " at position: " << (it2 - numbers2.begin()) << std::endl;
} else {
std::cout << "No adjacent elements with same parity found.\n";
}
return 0;
}
Các hàm liên quan
find | Tìm kiếm phần tử đầu tiên trong một phạm vi có giá trị bằng với một giá trị cho trước |
find_if | Tìm kiếm phần tử đầu tiên trong một phạm vi thỏa mãn một điều kiện cụ thể được xác định bởi một hàm vị từ |
unique | Loại bỏ các phần tử trùng lặp liên tiếp ra khỏi một phạm vi |