手動實作STL中的search_n算法,代碼如下:
#pragma once
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
template<typename ForwardIter, typename Integer, typename T>
ForwardIter np_serach_n(
ForwardIter first,
ForwardIter last,
Integer count,
const T& value)
{
if (count < 0)
return first;
first = find(first, last, value);
while (first != last)
{
ForwardIter cur = first;
cur++;
int n = count - 1;
while (cur != last && n != 0 && *cur == value)
{
cur++;
n--;
}
if (n == 0)
return first;
else
first = find(cur, last, value);
}
return last;
}
template<typename ForwardIter, typename Integer, typename T, typename BinaryPred>
ForwardIter np_serach_n(
ForwardIter first,
ForwardIter last,
Integer count,
const T& value,
BinaryPred binary_pred)
{
if (count < 0)
return first;
while (first != last && !binary_pred(*first, value))
++first;
while (first != last)
{
ForwardIter cur = first;
++cur;
Integer n = count - 1;
while (cur != last && n != 0 && binary_pred(*cur, value)) {
cur++;
n--;
}
if (n == 0)
return first;
else
{
first = cur;
while (first != last && !binary_pred(*first, value))
++first;
}
}
return last;
}
調用方法:
// Neptune.cpp: 定義應用程式的入口點。
//
#include "Neptune.h"
#include "non_mutate.h"
#include <functional>
void test_np_search_n()
{
int count = 2;
string number = "world";
vector<string> numbers{ "Hello", "world", "world", "I", "love", "you", "world" };
auto it = np_serach_n<decltype(numbers.cbegin()), decltype(count), decltype(number)>(
numbers.cbegin(), numbers.cend(), count, number);
if (it != numbers.cend())
{
cout << "Find " << count << " " << number << " index is: " << it - numbers.cbegin();
}
else
{
cout << "Can't find " << count << " " << number;
}
}
void test_np_serach_n_predicat(int count = 2)
{
//int number = 4;
//vector<int> data{ 1, 3, 4, 5, 2, 1, 7, 8, 9 };
std::string number("hellooo");
vector<decltype(number)> data {"hello", "world", "chris", "I", "love", "you"};
std::function<bool(decltype(*data.cbegin()), decltype(number))> Predicate;
auto it = np_serach_n<decltype(data.cbegin()), decltype(count), decltype(number), decltype(Predicate)>(
data.cbegin(),
data.cend(),
count,
number,
[](decltype(*data.cbegin()) a, decltype(number) b) -> bool {
return b.length() - a.length() > 2;
});
if (it != data.cend())
{
cout << "Find " << count << " index is: " << it - data.cbegin();
}
else
{
cout << "Can't find! ";
}
}
int main()
{
test_np_search_n();
test_np_serach_n_predicat();
return 0;
}