«

C++中的容器适配器与仿函数技术怎么使用

时间:2024-5-3 17:48     作者:韩俊     分类: Java


本文小编为大家详细介绍“C++中的容器适配器与仿函数技术怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中的容器适配器与仿函数技术怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、容器适配器

容器适配器其实是一种设计模式。转换出我们想要的东西。

比方说我们实现栈的时候既可以用数组,也可以用链表,此时我们就可以用到容器适配器了。

namespace yyh
{
    template <class T, class container = vector<T>>
    class stack
    {
    public:
        void push(const T& x)
        {
            _con.push_back(x);
        }
        void pop()
        {
            _con.pop_back();
        }
        const T& top()
        {
            return _con.back();
        }
        bool empty()
        {
            return _con.empty();
        }
    private:
        container _con;
    };
}
int main()
{
    yyh::stack<int, vector<int>> st1;
    yyh::stack<int, list<int>> st2;
    return 0;
}

这样我们就可以用不同的底层实现栈了。

二、仿函数

仿函数其实就是用类重载()的方式来模拟一个函数。

我们现在写一个比较大小的仿函数

namespace yyh
{
    template <class T>
    struct less
    {
        bool operator()(const T& x, const T& y)
        {
            return x < y;
        }
    };
    template <class T>
    struct greater
    {
        bool operator()(const T& x, const T& y)
        {
            return x > y;
        }
    };
}

这个类我们就可以成为仿函数,而该类的对象成为函数对象。

用法:

当我们想同时派升序和降序的时候,我们可以利用仿函数来进行比较。

namespace yyh
{
    template <class T>
    struct less
    {
        bool operator()(const T& x, const T& y)
        {
            return x < y;
        }
    };
    template <class T>
    struct greater
    {
        bool operator()(const T& x, const T& y)
        {
            return x > y;
        }
    };
    template <class T, class compare>
    void BubbleSort(vector<T>& a, compare com)
    {
        for (int i = 0; i < a.size() - 1; i++)
        {
            //用来判断是否交换过,提高效率
            int flag = 1;
            for (int cur = 0; cur < a.size() - 1 - i; cur++)
            {
                if (com(a[cur + 1], a[cur]))
                {
                    swap(a[cur], a[cur + 1]);
                    flag = 0;
                }
            }
            if (flag)
            {
                break;
            }
        }
    }
}
int main()
{
    yyh::less<int> lessFun;
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(5);
    v1.push_back(2);
    v1.push_back(4);
    v1.push_back(3);
    yyh::BubbleSort(v1, lessFun);
    for (auto e : v1)
    {
        cout << e << " ";
    }
    return 0;
}

标签: java

热门推荐