• C++_STL_2021.11.12


    手动实现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;
    }
  • 相关阅读:
    BZOJ4975: [Lydsy1708月赛]区间翻转( 博弈&逆序对)
    BZOJ4550: 小奇的博弈(NIMK博弈& 组合数& DP)
    BZOJ5301: [Cqoi2018]异或序列(莫队)
    BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
    BZOJ5125: [Lydsy1712月赛]小Q的书架(DP决策单调性)
    codevs 2495 水叮当的舞步
    bzoj 1086: [SCOI2005]王室联邦
    bzoj 3720: Gty的妹子树
    bzoj 1024: [SCOI2009]生日快乐
    bzoj 1085: [SCOI2005]骑士精神
  • 原文地址:https://www.cnblogs.com/gwzz/p/15545249.html
Copyright © 2020-2023  润新知