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

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ãn pred) 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

  1. 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.
  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 search_n() sử dụng toán tử == để so sánh các phần tử với val. 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. count phải là một số nguyên dương.
  5. 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;
}