std::is_partitioned
#include <algorithm>
template <class InputIterator, class UnaryPredicate>
bool is_partitioned (InputIterator first, InputIterator last,
UnaryPredicate pred);
Kiểm tra xem một phạm vi (range) có được phân hoạch (partitioned) theo một điều kiện cho trước (được xác định bởi một hàm vị từ) hay không. Nghĩa là, nó kiểm tra xem tất cả các phần tử thỏa mãn điều kiện có xuất hiện trước tất cả các phần tử không thỏa mãn điều kiện hay không.
Tham số
first
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi cần kiểm tra.
last
- Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần kiểm tra. Phạm vi là
[first, last)
.
pred
- Một hàm vị từ (unary predicate) nhận một đối số là phần tử trong phạm vi và trả về true nếu phần tử thỏa mãn điều kiện phân hoạch, false nếu không.
Giá trị trả về
true
- Nếu phạm vi được phân hoạch theo điều kiện
pred
, tức là tất cả các phần tử thỏa mãn điều kiện xuất hiện trước tất cả các phần tử không thỏa mãn điều kiện.
false
- Nếu phạm vi không được phân hoạch theo điều kiện
pred
.
Đặc điểm
- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. is_partitioned()
không thay đổi phạm vi đầu vào.is_partitioned()
chỉ kiểm tra tính phân hoạch, không đảm bảo thứ tự cụ thể của các phần tử trong mỗi nhóm (thỏa mãn và không thỏa mãn điều kiện).is_partitioned()
yêu cầu Input Iterator, cho phép di chuyển một chiều về phía trước.- Trong C++11 trở lên, bạn có thể sử dụng biểu thức lambda cho hàm vị từ
pred
để code ngắn gọn và dễ đọc hơn. is_partitioned()
thường được sử dụng để:- Kiểm tra xem dữ liệu đã được phân hoạch theo một tiêu chí cụ thể hay chưa trước khi thực hiện các thao tác khác.
- Xác minh kết quả của các thuật toán phân hoạch như
partition()
hoặcstable_partition()
.
Phân biệt với partition()
partition()
thực sự phân hoạch lại các phần tử trong phạm vi.is_partitioned()
chỉ kiểm tra xem phạm vi đã được phân hoạch hay chưa.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
// Hàm vị từ kiểm tra số chẵn
bool isEven(int n) {
return n % 2 == 0;
}
int main() {
std::vector<int> numbers1 = {2, 4, 6, 1, 3, 5};
std::vector<int> numbers2 = {1, 2, 3, 4, 5, 6};
// Kiểm tra xem numbers1 có được phân hoạch theo tính chẵn lẻ hay không
if (std::is_partitioned(numbers1.begin(), numbers1.end(), isEven)) {
std::cout << "numbers1 is partitioned (even numbers first).\n";
} else {
std::cout << "numbers1 is not partitioned (even numbers first).\n";
}
// Kiểm tra xem numbers2 có được phân hoạch theo tính chẵn lẻ hay không
if (std::is_partitioned(numbers2.begin(), numbers2.end(), isEven)) {
std::cout << "numbers2 is partitioned (even numbers first).\n";
} else {
std::cout << "numbers2 is not partitioned (even numbers first).\n";
}
return 0;
}
Các hàm liên quan
partition | Sắp xếp lại các phần tử trong một phạm vi |
partition_point | Tìm vị trí "điểm phân hoạch" đầu tiên trong một phạm vi đã được phân hoạch |