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

std::includes

#include <algorithm>

// So sánh bằng toán tử <
template <class InputIterator1, class InputIterator2>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2);

// Sử dụng hàm so sánh tùy chỉnh
template <class InputIterator1, class InputIterator2, class Compare>
bool includes (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp);

Kiểm tra xem một phạm vi (range) đã được sắp xếp có chứa tất cả các phần tử của một phạm vi đã được sắp xếp khác hay không. Nói cách khác, nó kiểm tra xem phạm vi thứ hai có phải là tập hợp con (subset) của phạm vi thứ nhất hay không (xét về các phần tử, không xét về thứ tự liên tiếp).

Tham số

first1

  • Input Iterator trỏ đến phần tử đầu tiên trong phạm vi thứ nhất (phạm vi lớn hơn, được kiểm tra xem có chứa phạm vi kia không).

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 (phạm vi nhỏ hơn, được kiểm tra xem có nằm trong phạm vi đầu tiên không).

last2

  • Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi thứ hai. Phạm vi thứ hai là [first2, last2).

comp

  • Một hàm hoặc đối tượng hàm (comparator) nhận hai đối số (mỗi đối số là một phần tử từ một trong hai phạm vi) và trả về true nếu phần tử thứ nhất được coi là nhỏ hơn phần tử thứ hai theo tiêu chí so sánh, false nếu ngược lại. (Phiên bản 2)

Giá trị trả về

true

  • Nếu phạm vi thứ nhất chứa tất cả các phần tử của phạm vi thứ hai (tức là phạm vi thứ hai là tập hợp con của phạm vi thứ nhất).

false

  • Nếu phạm vi thứ nhất không chứa tất cả các phần tử của phạm vi thứ hai.

Đặc điểm

  1. Cả hai phạm vi đầu vào [first1, last1)[first2, last2) phải được sắp xếp theo cùng một tiêu chí so sánh.
  2. includes() không thay đổi các phạm vi đầu vào.
  3. includes() yêu cầu Input Iterator cho cả hai phạm vi đầu vào.
  4. Trong C++11 trở lên, bạn có thể sử dụng biểu thức lambda cho hàm so sánh comp (phiên bản 2) để code ngắn gọn và dễ đọc hơn.
  5. includes() không yêu cầu các phần tử trong phạm vi con phải liên tiếp nhau trong phạm vi lớn, nó chỉ kiểm tra sự hiện diện của các phần tử.
  6. Cả hai phạm vi đầu vào phải được sắp xếp theo cùng một tiêu chí so sánh (tăng dần theo mặc định hoặc theo tiêu chí so sánh tùy chỉnh). Nếu các phạm vi không được sắp xếp, kết quả sẽ không chính xác.
  7. includes() thường được sử dụng để:
    • Kiểm tra xem một tập hợp có phải là tập hợp con của một tập hợp khác hay không (khi cả hai tập hợp đã được sắp xếp).
    • Xác định xem tất cả các phần tử của một container có nằm trong một container khác hay không (khi cả hai container đã được sắp xếp).

Ví dụ

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

// Hàm so sánh để kiểm tra với dãy giảm dần
bool compareDescending(int a, int b) {
return a > b; // Lưu ý: Đảo ngược logic so sánh cho dãy giảm dần
}

int main() {
std::vector<int> numbers1 = {1, 2, 3, 4, 5, 6, 7, 8};
std::vector<int> numbers2 = {3, 5, 7};
std::vector<int> numbers3 = {3, 5, 9};

// Kiểm tra xem numbers1 có chứa numbers2 không
if (std::includes(numbers1.begin(), numbers1.end(), numbers2.begin(), numbers2.end())) {
std::cout << "numbers1 includes numbers2.\n";
} else {
std::cout << "numbers1 does not include numbers2.\n";
}

// Kiểm tra xem numbers1 có chứa numbers3 không
if (std::includes(numbers1.begin(), numbers1.end(), numbers3.begin(), numbers3.end())) {
std::cout << "numbers1 includes numbers3.\n";
} else {
std::cout << "numbers1 does not include numbers3.\n";
}

std::vector<int> numbers4 = {8, 7, 6, 5, 4, 3, 2, 1};
std::vector<int> numbers5 = {7, 5, 3};

// Kiểm tra xem numbers4 có chứa numbers5 không (sử dụng compareDescending)
if (std::includes(numbers4.begin(), numbers4.end(), numbers5.begin(), numbers5.end(), compareDescending)) {
std::cout << "numbers4 includes numbers5 (descending).\n";
} else {
std::cout << "numbers4 does not include numbers5 (descending).\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
find_endTì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
equalKiểm tra xem hai phạm vi có bằng nhau hay không