当前位置: 首页 > news >正文

自己做网站做那种类型网络广告的概念

自己做网站做那种类型,网络广告的概念,信誉好的广州做网站,东莞手机网站建设公司优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。 注意&#xff1…

      优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

注意: 默认情况下priority_queue是大堆。

priority_queue的使用

priority_queue的构造函数

模板参数 Compare

在 std::priority_queue 类中,通过模板参数 Compare 来指定用于比较元素的函数对象,从而影响堆的排序方式。Compare 是一个仿函数,它定义了元素之间的比较方式。根据不同的 Compare,优先队列可以变成大堆(最大堆)或小堆(最小堆)。

默认的 std::less<T>(大堆):
std::less 是一个函数对象,它重载了 operator(),用于比较两个元素。它返回一个布尔值,表示是否第一个参数小于第二个参数。在默认情况下,如果不提供 Compare 参数,优先队列使用 std::less 作为比较函数对象,即大堆。这意味着在大堆中,父节点的值总是大于或等于子节点的值。

std::greater<T>(小堆):
std::greater<T> 是另一个函数对象,它重载了 operator(),用于比较两个元素。与 std::less<T> 不同,std::greater<T> 返回一个布尔值,表示第一个参数是否大于第二个参数。如果你将 std::greater<T> 传递给 priority_queue,它将会构造一个小堆。在小堆中,父节点的值总是小于或等于子节点的值。

仿函数

仿函数(Functor)是一种重载了函数调用操作符 operator() 的类对象,使得该对象可以像函数一样被调用。它实际上是一种函数对象,它可以具有自己的成员变量和操作,同时可以在使用上类似于普通函数。

使用仿函数的主要优点之一是可以将函数的行为和状态封装在对象中,从而使代码更具有可读性和可维护性。仿函数可以用于各种情况,包括标准算法、STL容器和其他需要函数式操作的地方。

例如:

// 仿函数/函数对象
template<class T>
class Less
{
public:
    bool operator()(const T& x, const T& y)
    {
        return x < y;
    }
};

empty():检查优先队列是否为空
size():用于获取优先队列中元素的数量
top():获取优先队列的顶部元素(最大或最小元素,取决于堆的类型),但不改变队列的内容
push():用于将新元素添加到优先队列中
emplace():在优先队列中插入一个新元素

pop():将优先队列的顶部元素移除,同时会重新调整堆以维持堆的性质

swap(): 用于交换调用对象和传递的参数 x 之间的内容,将两个优先队列的内容互换,但不会改变它们的比较函数或其他属性

模拟实现priority_queue

// Compare进行比较的仿函数 less->大堆
template<class T>
class Less
{
public:
    bool operator()(const T& x, const T& y)
    {
        return x < y;
    }
};


class Date
{
public:
    Date(int year = 1900, int month = 1, int day = 1)
        : _year(year)
        , _month(month)
        , _day(day)
    {}
    bool operator<(const Date& d)const
    {
        return (_year < d._year) ||
            (_year == d._year && _month < d._month) ||
            (_year == d._year && _month == d._month && _day < d._day);
    }
    bool operator>(const Date& d)const
    {
        return (_year > d._year) ||
            (_year == d._year && _month > d._month) ||
            (_year == d._year && _month == d._month && _day > d._day);
    }
    friend ostream& operator<<(ostream& _cout, const Date& d)
    {
        _cout << d._year << "-" << d._month << "-" << d._day;
        return _cout;
    }
private:
    int _year;
    int _month;
    int _day;
};

//类模板特化
template<>
struct Less<Date*>
{
    bool operator()(const Date* x, const Date* y)
    {
        return *x < *y;
    }
};

// Compare进行比较的仿函数 greater->小堆

template<class T>
class Greater
{
public:
    bool operator()(const T& x, const T& y)
    {
        return x > y;
    }
};
template<class T, class Container = vector<T>, class Compare = Less<T>>
class priority_queue
{
public:
    priority_queue()
    {}

    template <class InputIterator>
    priority_queue(InputIterator first, InputIterator last)
        :_con(first, last)
    {
        // ½¨¶Ñ
        for (int i = (_con.size() - 2) / 2; i >= 0; --i)
        {
            adjust_down(i);
        }
    }

    void adjust_up(int child)
    {
        Compare com;
        int parent = (child - 1) / 2;
        while (child > 0)
        {
            //有名对象
            if (com(_con[parent], _con[child]))
            //匿名对象
            //if (Compare()(_con[parent], _con[child]))
                //if (_con[parent] < _con[child])
            {
                swap(_con[child], _con[parent]);
                child = parent;
                parent = (child - 1) / 2;
            }
            else
            {
                break;
            }
        }
    }

    void adjust_down(int parent)
    {
        Compare com;
        size_t child = parent * 2 + 1;
        while (child < _con.size())
        {
            //if (child + 1 < _con.size() 
            //    //&& _con[child] < _con[child + 1])
            if (child + 1 < _con.size()
                && com(_con[child], _con[child + 1]))
            {
                ++child;
            }

            //if (_con[parent] < _con[child])
            if (com(_con[parent], _con[child]))
            {
                swap(_con[child], _con[parent]);
                parent = child;
                child = parent * 2 + 1;
            }
            else
            {
                break;
            }
        }
    }

    void push(const T& x)
    {
        _con.push_back(x);
        adjust_up(_con.size() - 1);
    }

    void pop()
    {
        swap(_con[0], _con[_con.size() - 1]);
        _con.pop_back();
        adjust_down(0);
    }

    const T& top()
    {
        return _con[0];
    }

    bool empty()
    {
        return _con.empty();
    }

    size_t size()
    {
        return _con.size();
    }
private:
    Container _con;
};

class PDateLess {
public:
    bool operator()(const Date* p1, const Date* p2) {
        return *p1 < *p2;
    }
};
class PDateGreater{
public:
    bool operator()(const Date* p1, const Date* p2) {
        return *p1 > *p2;
    }
};
void test_priority_queue() {
    priority_queue<int> pq;
    pq.push(1);
    pq.push(2);
    pq.push(3);
    pq.push(4);
    pq.push(1);

    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    cout << endl;
}
void test_priority_queue2()
{
    // 大堆,需要用户在自定义类型中提供<的重载
    priority_queue<Date,vector<Date>,Less<Date>> q1;
    q1.push(Date(2018, 10, 29));
    q1.push(Date(2018, 10, 28));
    q1.push(Date(2018, 10, 30));
    cout << q1.top() << endl;
    priority_queue<Date*, vector<Date*>> q3;
    //priority_queue<Date*, vector<Date*>,PDateLess> q3;
    q3.push(new Date(2018, 10, 29));
    q3.push(new Date(2018, 10, 28));
    q3.push(new Date(2018, 10, 30));
    cout << *(q3.top()) << endl;
    // 如果要创建小堆,需要用户提供>的重载
    priority_queue<Date, vector<Date>, Greater<Date>> q2;
    q2.push(Date(2018, 10, 29));
    q2.push(Date(2018, 10, 28));
    q2.push(Date(2018, 10, 30));
    cout << q2.top() << endl;
}

成员函数的模拟实现

模板类 priority_queue:
这是一个模板类,它代表了一个优先队列的实现。它接受三个模板参数:T(元素类型),Container(底层容器类型,默认为 std::vector<T>),和 Compare(用于比较元素的仿函数,默认为 std::less<T>)

Compare 是一个模板参数,用于进行元素的比较。它是一个仿函数,可以是 std::less<T>(默认)或 std::greater<T>,具体取决于用户提供的优先队列类型。Compare 仿函数用于确定在堆中的元素排序方式,从而决定了是最大堆还是最小堆。在 priority_queue 类的各个成员函数中,通过调用 Compare 仿函数来进行元素的比较,从而实现了插入和调整堆的操作。

构造函数 priority_queue():
这是一个默认构造函数,不需要使用 Compare 仿函数进行比较。

构造函数模板 priority_queue(InputIterator first, InputIterator last):
在构造函数内部,使用 Compare 仿函数来执行比较操作,以确定元素的顺序。在添加元素后,通过调用 adjust_down 函数来构建堆。

成员函数 adjust_up(size_t child):
在上浮操作中,使用 Compare 仿函数执行比较,以确定是否需要交换父子节点的位置,从而保持堆的性质。

成员函数 push(const T& x):
在插入操作中,首先将新元素添加到底层容器 _con,然后通过调用 adjust_up 函数来执行上浮操作,保证新元素位于合适的位置。

成员函数 adjust_down(size_t parent):
在下沉操作中,使用 Compare 仿函数执行比较,以确定是否需要交换父子节点的位置,从而保持堆的性质。

成员函数 pop():
在删除操作中,首先将顶部元素与底层容器的最后一个元素交换,然后通过调用 adjust_down 函数来执行下沉操作,保证堆的性质。

成员函数 const T& top():
通过返回 _con[0],获取优先队列的顶部元素。


文章转载自:
http://dinncograveyard.zfyr.cn
http://dinncoendotrophic.zfyr.cn
http://dinncostraighten.zfyr.cn
http://dinncopotentially.zfyr.cn
http://dinncominuend.zfyr.cn
http://dinnconzima.zfyr.cn
http://dinncoradioamplifier.zfyr.cn
http://dinncogarlandry.zfyr.cn
http://dinncofranglification.zfyr.cn
http://dinncoceo.zfyr.cn
http://dinncoofs.zfyr.cn
http://dinncoequiform.zfyr.cn
http://dinncoprehensile.zfyr.cn
http://dinncoinsanitation.zfyr.cn
http://dinncotriticum.zfyr.cn
http://dinncobrahma.zfyr.cn
http://dinncoprepare.zfyr.cn
http://dinncosmithiantha.zfyr.cn
http://dinncohutment.zfyr.cn
http://dinncoclasspath.zfyr.cn
http://dinncoshave.zfyr.cn
http://dinncoguitarfish.zfyr.cn
http://dinncogalavant.zfyr.cn
http://dinncodiammonium.zfyr.cn
http://dinncocognizable.zfyr.cn
http://dinncoanemophilous.zfyr.cn
http://dinnconetop.zfyr.cn
http://dinncogasdynamic.zfyr.cn
http://dinncothoracopagus.zfyr.cn
http://dinncosebastian.zfyr.cn
http://dinncobelligerence.zfyr.cn
http://dinncofabulously.zfyr.cn
http://dinncoyardbird.zfyr.cn
http://dinncoblunderbuss.zfyr.cn
http://dinncoinfidel.zfyr.cn
http://dinncoelemi.zfyr.cn
http://dinncoskinnerian.zfyr.cn
http://dinncofido.zfyr.cn
http://dinnconazaritism.zfyr.cn
http://dinncofatheaded.zfyr.cn
http://dinncoreveille.zfyr.cn
http://dinncoirreligion.zfyr.cn
http://dinncoquits.zfyr.cn
http://dinncolbj.zfyr.cn
http://dinncobrattish.zfyr.cn
http://dinncoperipeteia.zfyr.cn
http://dinncoretreat.zfyr.cn
http://dinncomemorise.zfyr.cn
http://dinncosyneresis.zfyr.cn
http://dinncophenetic.zfyr.cn
http://dinncolionise.zfyr.cn
http://dinncounaffectedly.zfyr.cn
http://dinncosmithwork.zfyr.cn
http://dinncohousekeeping.zfyr.cn
http://dinncohomoiotherm.zfyr.cn
http://dinncosnakestone.zfyr.cn
http://dinncoequiform.zfyr.cn
http://dinncoboniface.zfyr.cn
http://dinnconarky.zfyr.cn
http://dinncobedquilt.zfyr.cn
http://dinncoadamantane.zfyr.cn
http://dinncocellobiose.zfyr.cn
http://dinncocholine.zfyr.cn
http://dinncoassizes.zfyr.cn
http://dinncoviability.zfyr.cn
http://dinncomiskolc.zfyr.cn
http://dinncowiretap.zfyr.cn
http://dinncoministration.zfyr.cn
http://dinncochiefy.zfyr.cn
http://dinncoziti.zfyr.cn
http://dinncointuitionalist.zfyr.cn
http://dinncomatrilateral.zfyr.cn
http://dinnconephoscope.zfyr.cn
http://dinncolifeful.zfyr.cn
http://dinncocresylic.zfyr.cn
http://dinncoclampdown.zfyr.cn
http://dinncolabelled.zfyr.cn
http://dinncospearman.zfyr.cn
http://dinncostonewalling.zfyr.cn
http://dinncocrookedly.zfyr.cn
http://dinncoclout.zfyr.cn
http://dinncocaesardom.zfyr.cn
http://dinncogeophysics.zfyr.cn
http://dinncodrillmaster.zfyr.cn
http://dinncochemotherapy.zfyr.cn
http://dinncosulaiman.zfyr.cn
http://dinncolate.zfyr.cn
http://dinncopennyworth.zfyr.cn
http://dinnconotum.zfyr.cn
http://dinncoindium.zfyr.cn
http://dinncovicissitudinary.zfyr.cn
http://dinncoethnobiology.zfyr.cn
http://dinncohomologic.zfyr.cn
http://dinncolithontriptic.zfyr.cn
http://dinncopeart.zfyr.cn
http://dinncotumbler.zfyr.cn
http://dinncotoilet.zfyr.cn
http://dinncofetichist.zfyr.cn
http://dinncoequity.zfyr.cn
http://dinncosnuffle.zfyr.cn
http://www.dinnco.com/news/105933.html

相关文章:

  • 免费网站优化排名微营销系统
  • 晋江做鞋子批发的网站营销推广方法有哪些
  • 美国做垂直电商的网站有哪些sem营销推广
  • 兰州模板网站建设优化营商环境建议
  • 山东省住房城乡建设厅查询网站首页惠州百度seo找谁
  • 苏州做网站推广的seo网络排名优化
  • 个人做动漫资源网站有哪些百度推广获客成本大概多少
  • 苏宁易购网站建设的目标推广平台有哪些渠道
  • 多个wordpress网站合并山东网站建设
  • 做买衣服的网站有哪些月饼营销软文
  • 苹果给第三方网站做图标自己想做个网站怎么做
  • 怎么做好网站建设全网整合营销推广系统
  • 做网站赚钱 百度网盟什么软件推广效果好
  • 用bootstrap做的网站如何做电商赚钱
  • 中关村手机网百度笔记排名优化
  • 自己编程做网站2023年7月疫情爆发
  • 网站哪个公司做的比较好的百度推广收费
  • 蚌埠市做网站百度灰色词优化排名
  • 做网站优化推广手机网站模板建站
  • iis网站搭建专业的seo排名优化
  • 湖南省做网站的移动慧生活app下载
  • 做网站一般有什么题目seo搜索排名影响因素主要有
  • 做电商网站的流程个人接广告的平台
  • wordpress会员卡密丽水百度seo
  • 赵公口网站建设谷歌浏览器下载安卓版
  • 在线网站搭建系统网站目录扫描
  • wordpress4.9.8漏洞如何优化标题关键词
  • 在线构建网站1688关键词排名查询工具
  • 大馆陶网站手机免费建网站
  • 米趋外贸网站建设曼联vs曼联直播