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

std::find_end

#include <algorithm>

// So sánh bằng toán tử ==
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2);

// Sử dụng hàm vị từ so sánh
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred);

Tìm kiếm sự xuất hiện cuối cùng của một dãy con (subsequence) trong một phạm vi (range) khác. Nói cách khác, nó tìm vị trí cuối cùng mà dãy con xuất hiện khớp hoàn toàn trong phạm vi lớn hơn.

Tham số

first1

  • Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi lớn hơn (nơi cần tìm kiếm).

last1

  • Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi lớn hơn.

first2

  • Forward Iterator trỏ đến phần tử đầu tiên trong dãy con cần tìm kiếm.

last2

  • Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong dãy con cần tìm kiếm.

pred

  • Một hàm vị từ (binary predicate) nhận hai đối số (một phần tử từ phạm vi lớn và một phần tử từ dãy con) 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ề

  • Iterator trỏ đến phần tử đầu tiên của sự xuất hiện cuối cùng của dãy con [first2, last2) trong phạm vi [first1, last1).
  • Nếu không tìm thấy dãy con trong phạm vi, hàm trả về last1.

Đặc điểm

  1. find_end() tìm kiếm sự xuất hiện cuối cùng của dãy con. Để tìm sự xuất hiện đầu tiên, hãy sử dụng std::search().
  2. Phạm vi [first1, last1)[first2, last2) là "nửa mở", không bao gồm phần tử last1last2.
  3. Phiên bản 1 của find_end() 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 find_end() phải hỗ trợ di chuyển nhiều lần (multi-pass), nghĩa là bạn có thể duyệt qua cùng một dãy nhiều lần.
  5. find_end() thường được sử dụng để tìm kiếm vị trí xuất hiện cuối cùng của một mẫu (pattern) trong một chuỗi hoặc một dãy các giá trị.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>

// 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> numbers = {1, 2, 3, 4, 1, 2, 3, 5, 1, 2, 3};
std::vector<int> subsequence = {1, 2, 3};

// Phiên bản 1: Tìm kiếm sự xuất hiện cuối cùng của {1, 2, 3}
std::vector<int>::iterator it = std::find_end(numbers.begin(), numbers.end(), subsequence.begin(), subsequence.end());

if (it != numbers.end()) {
std::cout << "Last occurrence of {1, 2, 3} starts at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "Subsequence {1, 2, 3} not found.\n";
}

std::string text = "This is a TeSt string, test.";
std::string pattern = "test";

// Phiên bản 2: Tìm kiếm không phân biệt hoa thường
std::string::iterator it2 = std::find_end(text.begin(), text.end(), pattern.begin(), pattern.end(), caseInsensitiveCompare);

if (it2 != text.end()) {
std::cout << "Last occurrence of 'test' (case-insensitive) starts at position: " << (it2 - text.begin()) << std::endl;
} else {
std::cout << "Pattern 'test' not found (case-insensitive).\n";
}

return 0;
}

Các hàm liên quan

searchTì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
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ừ