Chuyển tới nội dung chính

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 đến last nhưng không bao gồm last ([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

  1. adjacent_find() chỉ tìm kiếm cặp phần tử liên tiếp thỏa mãn điều kiện.
  2. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  3. 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ừ.
  4. Forward Iterator cần thiết cho adjacent_find() phải hỗ trợ di chuyển một lần (single-pass).
  5. 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

findTì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_ifTì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ừ
uniqueLoại bỏ các phần tử trùng lặp liên tiếp ra khỏi một phạm vi