std::search_n
#include <algorithm>
// So sánh bằng toán tử ==
template <class ForwardIterator, class Size, class T>
ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
Size count, const T& val);
// Sử dụng hàm vị từ so sánh
template <class ForwardIterator, class Size, class T, class BinaryPredicate>
ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
Size count, const T& val, BinaryPredicate pred);
Tìm kiếm sự xuất hiện đầu tiên của n phần tử liên tiếp và giống nhau (hoặc thỏa mãn điều kiện) trong một phạm vi (range).
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.
count
- Số lượng phần tử liên tiếp giống nhau (hoặc thỏa mãn điều kiện) cần tìm kiếm.
val
- Giá trị của các phần tử cần tìm kiếm (trong phiên bản 1).
pred
- Một hàm vị từ (binary predicate) nhận hai đối số (một phần tử từ phạm vi và giá trị
val
) và trả về true nếu chúng đượ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 chuỗi n phần tử liên tiếp đầu tiên khớp với giá trị
val
(hoặc thỏa mãnpred
) trong phạm vi[first, last)
. - Nếu không tìm thấy chuỗi n phần tử liên tiếp thỏa mãn điều kiện trong phạm vi, hàm trả về
last
.
Đặc điểm
search_n()
tìm kiếm sự xuất hiện đầu tiên của chuỗi lặp lại liên tiếp.- 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
search_n()
sử dụng toán tử==
để so sánh các phần tử vớival
. 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ừ. count
phải là một số nguyên dương.search_n()
thường được sử dụng để:- Tìm kiếm một chuỗi các giá trị giống nhau lặp lại liên tiếp trong một dãy.
- Phát hiện các mẫu lặp lại trong dữ liệu.
- Xác định các vùng có giá trị đồng nhất trong một tập hợp dữ liệu.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
// Hàm vị từ kiểm tra xem hai số có cùng dấu hay không
bool sameSign(int a, int b) {
return (a >= 0 && b >= 0) || (a < 0 && b < 0);
}
int main() {
std::vector<int> numbers = {1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 5};
// Phiên bản 1: Tìm kiếm 3 lần lặp lại liên tiếp của số 2
std::vector<int>::iterator it = std::search_n(numbers.begin(), numbers.end(), 3, 2);
if (it != numbers.end()) {
std::cout << "Three consecutive 2s found at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "Three consecutive 2s not found.\n";
}
// Phiên bản 1: Tìm kiếm 4 lần lặp lại liên tiếp của số 2
it = std::search_n(numbers.begin(), numbers.end(), 4, 2);
if (it != numbers.end()){
std::cout << "Four consecutive 2s found at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "Four consecutive 2s not found.\n";
}
// Phiên bản 2: Tìm kiếm 2 lần lặp lại liên tiếp của số âm
std::vector<int> numbers2 = {1, 2, -3, -3, 5, -1, -1, -1, 9};
std::vector<int>::iterator it2 = std::search_n(numbers2.begin(), numbers2.end(), 2, 0, sameSign);
if (it2 != numbers2.end()) {
std::cout << "Two consecutive negative numbers found at position: " << (it2 - numbers2.begin()) << std::endl;
} else {
std::cout << "Two consecutive negative numbers not found.\n";
}
return 0;
}