【十九】【C++】 priority_queue简单使用和仿函数

news2024/11/25 14:41:09

priority_queue文档介绍翻译

优先队列是一种容器适配器,专门设计成其中的第一个元素始终是根据某种严格的弱排序准则最大的元素。

这种上下文类似于堆,其中元素可以在任何时刻插入,而只能检索最大堆元素(在优先队列中顶部的元素)。

优先队列被实现为容器适配器,这些适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的“后面”弹出,这被称为优先队列的顶部。

底层容器可以是任何标准容器类模板或其他特定设计的容器类。容器必须通过随机访问迭代器进行访问,并支持以下操作:

  • empty()

  • size()

  • front()

  • push_back()

  • pop_back()

标准容器类vectordeque满足这些要求。默认情况下,如果没有为特定优先队列类实例化指定容器类,则使用标准容器vector

需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器会在需要时自动调用算法函数make_heappush_heappop_heap来完成这一点。

简单使用

优先队列(Priority Queue)是一种特殊的队列,它的出队顺序是按照元素的优先级决定的,而不是元素进入队列的先后顺序。在C++中,优先队列通常通过STL中的priority_queue容器来实现。priority_queue<queue>头文件中定义,它可以让你轻松地实现一个能够根据元素优先级进行动态排序的队列。

基本操作

插入元素(push):将一个元素添加到优先队列中。

获取顶部元素(top):返回优先级最高的元素,但不从队列中移除它。

删除顶部元素(pop):移除优先级最高的元素。

检查队列是否为空(empty):检查优先队列是否没有任何元素。

获取队列的大小(size):返回优先队列中的元素数量。

示例代码

下面是一个使用priority_queue的基本示例:

 
#include <iostream>
#include <queue>

int main() {
    // 创建一个int类型的优先队列,默认是最大堆
    std::priority_queue<int> pq;

    // 插入元素
    pq.push(30);
    pq.push(10);
    pq.push(20);
    pq.push(5);

    // 循环直到优先队列为空
    while (!pq.empty()) {
        // 打印顶部元素
        std::cout << pq.top() << " ";
        // 移除顶部元素
        pq.pop();
    }

    return 0;
}

最小堆优先队列

默认情况下,C++的priority_queue使用std::less<T>作为比较函数,这意味着它将实现为一个最大堆,优先级最高的(值最大的)元素会被放在队列的前面。

如果你想创建一个最小堆,使得优先级最低的元素先出队,你可以通过传递一个比较函数来实现。例如:

 
#include <iostream>
#include <queue>
#include <vector>
#include <functional>

int main() {
    // 创建一个最小堆优先队列
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

    pq.push(30);
    pq.push(10);
    pq.push(20);
    pq.push(5);

    while (!pq.empty()) {
        std::cout << pq.top() << " ";
        pq.pop();
    }

    return 0;
}

优先队列默认创建最大堆

 
/*优先队列默认创建大堆*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;

void TestPriorityQueue1()
 {
    // 默认按照less方式比较,创建的是大堆
    priority_queue<int> q;
    q.push(5);
    q.push(4);
    q.push(8);
    q.push(1);
    q.push(9);
    q.push(2);
    q.push(6);
    q.push(3);
    q.push(7);
    q.push(0);
    cout << q.size() << endl;
    cout << q.top() << endl;
    
    q.pop();
    q.pop();
    q.pop();
    cout << q.size() << endl;
    cout << q.top() << endl;
 }

int main(){
    TestPriorityQueue1();
 }

#endif

优先队列主动创建最小堆

 
/*优先队列默认创建最小堆*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
// greater是STL提供的以大于方式比较两个元素的类模板
 // 在使用时一定要<functional>的头文件
void TestPriorityQueue2()
 {
    // 如果要创建小堆,则元素必须按照大于的方式比较
    priority_queue<int,vector<int>, greater<int>> q;
    q.push(5);
    q.push(4);
    q.push(8);
    q.push(1);
    q.push(9);
    q.push(2);
    q.push(6);
    q.push(3);
    q.push(7);
    q.push(0);
    cout << q.size() << endl;
    cout << q.top() << endl;
    
     q.pop();
    q.pop();
    q.pop();
    cout << q.size() << endl;
    cout << q.top() << endl;
 }

int main(){
    TestPriorityQueue2();
 }

#endif

优先队列日期类创建最大堆

 
/*优先队列日期类最大堆*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    
     bool operator<(const Date& d)const
    {
        return _day < d._day;
    }
    
     bool operator>(const Date& d)const
    {
        return _day > d._day;
    }
    
     void Show()const{
        cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
    }

private:
    int _year;
    int _month;
    int _day;
 };



void TestPriorityQueue3()
 {
    priority_queue<Date> q;
    
     Date d1(2023, 4, 22);
    Date d2(2023, 4, 21);
    Date d3(2023, 4, 23);
    
     q.push(d1);
    q.push(d2);
    q.push(d3);
    
     while (!q.empty()) {
        q.top().Show();
        q.pop();
    }
    
}

int main(){
    TestPriorityQueue3();
 }

#endif

优先队列范围迭代器创建对象

 
/*优先队列范围迭代器创建对象*/
#if 1

#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;

void TestPriorityQueue5()
 {
    vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
    priority_queue<int> q(v.begin(), v.end());
 }
int main(){
    TestPriorityQueue5();
 }

#endif

优先队列日期类创建最小堆

 
/*优先队列日期类创建最小堆*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    
     bool operator<(const Date& d)const
    {
        return _day < d._day;
    }
    
     bool operator>(const Date& d)const
    {
        return _day > d._day;
    }
    
     void Show()const{
        cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
    }
    
private:
    int _year;
    int _month;
    int _day;
 };

void TestPriorityQueue4()
 {
    priority_queue<Date, vector<Date>, greater<Date>> q;
    
     Date d1(2023, 4, 22);
    Date d2(2023, 4, 21);
    Date d3(2023, 4, 23);
    
     q.push(d1);
    q.push(d2);
    q.push(d3);
    
     while (!q.empty()) {
        q.top().Show();
        q.pop();
    }

 }
int main(){
    TestPriorityQueue4();
 }

#endif

自定义判断函数,函数指针

 
/*自定义判断函数,函数指针*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    
     bool operator<(const Date& d)const
    {
        return _day < d._day;
    }
    
     bool operator>(const Date& d)const
    {
        return _day > d._day;
    }
    
     void Show()const{
        cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
    }
    friend bool CompareDate(const Date* left, const Date* right);
    friend class Compare;
private:
    int _year;
    int _month;
    int _day;
 };

bool CompareDate(const Date* left, const Date* right)
 {
    return left->_day < right->_day;
 }

typedef bool (*COM)(const Date* left, const Date* right);

void TestPriorityQueue6()
 {
    priority_queue<Date*, vector<Date*>, COM> q(CompareDate);
    
     Date d1(2023, 4, 22);
    Date d2(2023, 4, 21);
    Date d3(2023, 4, 23);
    
     q.push(&d1);
    q.push(&d2);
    q.push(&d3);
    
     while (!q.empty()) {
        Date* top = q.top(); // 获取优先队列顶部元素
        top->Show();         // 显示日期
        q.pop();             // 移除顶部元素
    }


 }


int main(){
    TestPriorityQueue6();
 }

typedef bool (*COM)(const Date* left, const Date* right);

这行代码定义了一个函数指针类型COM,用于指向一个特定的函数签名。这个签名要求函数接受两个指向Date对象的常量指针作为参数,并返回一个bool类型的结果。在这个上下文中,这样的函数通常用于比较两个Date对象,并根据比较结果(真或假)来排序或做出决策。

具体来说,typedef关键字在C++中用于为现有的类型定义一个新的名称。在这个例子中,它定义了COM作为一种新的类型,这种类型是指向函数的指针,这些函数具有特定的参数列表和返回类型:

  • 参数列表:两个const Date*类型的参数,表示指向常量Date对象的指针。使用指针允许函数不改变原始对象的状态,同时使用const确保函数内部不会修改这些对象。

  • 返回类型:bool,用于表示比较的结果。在排序或其他需要比较的场景中,返回值通常用于指示第一个参数是否在排序顺序上位于第二个参数之前。

priority_queue<Date*, vector<Date*>, COM> q(CompareDate);

这行代码创建了一个 std::priority_queue,其中包含了指向 Date 对象的指针。在这个 priority_queue 的声明中,使用了三个模板参数:

  • 元素类型:Date*,表示队列中存储的元素是指向 Date 对象的指针。

  • 底层容器:std::vector<Date*>,表示优先队列使用 std::vector 来存储这些指针。std::vector 是一个动态数组,适用于几乎所有类型的容器操作,而且在这里特别适合作为优先队列的底层数据结构。

  • 比较类型:COM,这是一个指向函数的指针类型,用于比较两个 Date 对象。在这个上下文中,COM 是通过之前定义的 typedef 创建的,指向一个接受两个 const Date* 类型参数的函数,并返回一个 bool 类型的结果。

接下来的部分 q(CompareDate);priority_queue构造函数调用,它接受一个名为 CompareDate 的函数作为参数。这个函数符合 COM 类型的要求,用于确定队列中元素的优先顺序。在这个例子中,CompareDate 函数基于日期对象的 _day 字段来比较日期,以决定它们在队列中的顺序。

这种方式允许自定义优先队列的排序准则,而不是仅依赖于元素类型的默认比较操作(例如,如果是基本类型或具有定义了 < 运算符的类型)。通过提供自定义比较函数,用户可以控制哪些元素应该被视为优先级更高,这在处理复杂数据类型或有特定排序需求的场合特别有用。

仿函数

在C++中,仿函数(Function Object或Functor)是一个行为类似函数的对象。具体来说,仿函数是通过重载 operator() 运算符的类实例,这让类的实例可以像函数一样被调用。仿函数提供了比普通函数指针更多的灵活性和功能,因为它们可以拥有自己的状态。

仿函数的优点

状态保持:与普通函数不同,仿函数可以有自己的状态。你可以在多次调用之间保持和修改这些状态。

内联调用:仿函数的调用可以被编译器内联,这意味着可以减少函数调用的开销,提高效率。

泛型编程:仿函数可以搭配标准模板库(STL)中的算法和容器使用,非常适合实现自定义的比较逻辑或操作。

示例:自定义比较仿函数

假设你想在 priority_queue 中使用自定义的比较逻辑,可以定义一个仿函数来实现这一点。以下是一个简化的 Date 类仿函数比较的例子:

 
#include <iostream>
#include <queue>
using namespace std;

class Date {
public:
    int year, month, day;
    Date(int y, int m, int d) : year(y), month(m), day(d) {}
};

// 自定义比较仿函数
class CompareDate {
public:
    bool operator()(const Date& lhs, const Date& rhs) const {
        // 比较逻辑:先年后月再日
        if (lhs.year != rhs.year) return lhs.year > rhs.year;
        if (lhs.month != rhs.month) return lhs.month > rhs.month;
        return lhs.day > rhs.day;
    }
};

int main() {
    priority_queue<Date, vector<Date>, CompareDate> pq;

    pq.push(Date(2023, 4, 22));
    pq.push(Date(2023, 5, 21));
    pq.push(Date(2023, 3, 23));

    while (!pq.empty()) {
        Date d = pq.top();
        cout << d.year << "-" << d.month << "-" << d.day << endl;
        pq.pop();
    }

    return 0;
}

在这个例子中,CompareDate 是一个仿函数,它重载了 operator() 来提供 Date 对象的比较逻辑。这个逻辑首先比较年份,如果年份相同,则比较月份,如果月份也相同,最后比较日。这个仿函数可以用作 priority_queue 的比较类型参数,从而定制容器中元素的排列顺序。

优先队列与仿函数结合

 
/*优先队列与仿函数结合*/
#if 1
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    
     bool operator<(const Date& d)const
    {
        return _day < d._day;
    }
    
     bool operator>(const Date& d)const
    {
        return _day > d._day;
    }
    
     void Show()const{
        cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
    }
    friend bool CompareDate(const Date* left, const Date* right);
    friend class Compare;
private:
    int _year;
    int _month;
    int _day;
 };

bool CompareDate(const Date* left, const Date* right)
 {
    return left->_day < right->_day;
 }

typedef bool (*COM)(const Date* left, const Date* right);
// 仿函数--函数对象:可以像函数一样使用的对象
class Compare
{
public:
    bool operator()(const Date* left, const Date* right)
    {
        return left->_day < right->_day;
    }
 };

void TestPriorityQueue7()
 {
    Date d1(2023, 4, 22);
    Date d2(2023, 4, 21);
    Date d3(2023, 4, 23);
    
     CompareDate(&d1, &d2);
    Compare com;
    com(&d1, &d2);
    com.operator()(&d1, &d2);
    
     priority_queue<Date*, vector<Date*>, Compare> q;
    q.push(&d1);
    q.push(&d2);
    q.push(&d3);
    
     while (!q.empty()) {
        Date* top = q.top(); // 获取优先队列顶部元素
        top->Show();         // 显示日期
        q.pop();             // 移除顶部元素
    }
 }

int main()
 {
    TestPriorityQueue7();
    return 0;
 }
#endif

对于优先队列比较参数的探究

 
priority_queue<Date*, vector<Date*>, Compare> q;//仿函数
priority_queue<Date, vector<Date>, CompareDate> pq;//仿函数
priority_queue<Date*, vector<Date*>, COM> q(CompareDate);//函数指针
priority_queue<Date, vector<Date>, greater<Date>> q; //默认greater对象

我们发现第三个参数,比较大小的参数,可以有上面三种使用方法。第一个和第二个是一样的,都是仿函数,仿函数本质是对象,和第四个同样是传入对象,而第三个传入的是函数指针。说明第三个参数可以接收函数指针也可以接收对象。

仿函数和函数指针的区别

虽然从表面上看,仿函数(通过类重载的 operator())和函数指针(指向一个具体函数的指针)都可以作为排序准则传递给 std::priority_queue(或其他模板类),它们在底层实现和使用方式上存在一些关键差异:

仿函数(Function Objects):仿函数是通过类实例化的对象,这些对象通过重载 operator() 来实现。它们可以有自己的状态(成员变量)并可以携带更多的上下文信息。在模板参数中传递仿函数类型时,你实际上传递的是一个类型(而非对象实例本身),std::priority_queue 在内部会创建这个类型的实例来进行元素比较。如果需要传递状态或参数给仿函数,你需要在仿函数类中提供相应的构造函数。

函数指针:函数指针是指向函数的指针,它不能携带状态(除非使用全局变量或静态变量,但这通常不是一个好的设计选择)。在模板参数中使用函数指针时,如 COM 类型,你实际上是在传递一个指向函数的指针,这意味着传递的是一个地址值。当你在构造 std::priority_queue 时提供 CompareDate 函数作为参数,你实际上是在提供一个具体的函数指针值。

对象与地址的传递

对于仿函数,你传递的是一个类型,std::priority_queue 使用这个类型在内部构造一个对象实例。这个过程并不涉及显式的地址传递,而是类型信息的传递。

对于函数指针,传递的确实是一个地址值,即函数在内存中的位置。

默认比较对象

当使用如 std::greater<Date> 这样的默认比较对象时,同样是传递了一个类型给 std::priority_queue,它会构造这个类型的实例来进行比较。std::greater<T>std::less<T> 是标准库提供的比较函数对象类型,它们也是通过重载 operator() 实现的。

优先队列创建对象的方式

使用默认比较函数对象

默认情况下,std::priority_queue使用std::less<T>作为其比较函数对象,构造一个最大堆。这意味着没有指定比较函数时,队列中的最大元素将会位于顶部。

 
std::priority_queue<int> pq; // 默认为最大堆,使用 std::less<int> 比较元素

使用标准库比较函数对象

可以通过显式指定比较函数对象(如std::greater<T>)来改变优先队列的排序行为,例如构建一个最小堆。

 
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

使用自定义仿函数

通过定义一个自定义的比较类(仿函数),可以实现更复杂的比较逻辑。该类需要重载operator()

 
class Compare {
public:
    bool operator()(int a, int b) {
        // 自定义比较逻辑
        return a > b; // 示例:构建最小堆
    }
};
std::priority_queue<int, std::vector<int>, Compare> customHeap;

使用函数指针

如果你有一个静态比较函数,也可以将其地址作为优先队列的比较逻辑。这通常适用于简单的比较逻辑或C风格的代码。

 
bool compare(int a, int b) { return a > b; } // 函数指针比较
// 注意:直接使用函数指针作为模板参数在标准的 priority_queue 中不直接支持,需要包装或转换为对象。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1451532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES入门知识点总结

目录 倒排索引 倒排索引 Elasticsearch的倒排索引是一种数据结构&#xff0c;用于加快基于文本的搜索操作。它的主要优势在于能够快速找到包含特定单词的文档。 倒排索引的构建过程如下&#xff1a; 文档分词&#xff1a;将文档内容分割成单独的词&#xff08;或者更小的词元…

Qlik Sense : 条形图

条形图 “条形图适合比较多个值。维度轴显示所比较的类别条目&#xff0c;度量轴显示每个类别条目的值。” Qlik Sense中的条形图是一种数据可视化工具&#xff0c;用于展示不同类别或维度之间的比较。它通过水平或垂直的条形表示数据&#xff0c;并根据数值的大小进行排序。…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-信号量semaphore

目录 一、信号量基本概念二、信号量运行机制三、信号量开发流程四、信号量接口五、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、信号量基本概念 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;可以实现任务间同步或共享资源的…

css3实现炫彩字体

这个字体颜色是动态变化的&#xff0c;直接上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…

2.16数据结构与算法学习日记(模拟,搜索)

目录 洛谷P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题目分析 代码示例 洛谷2080增进感情 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 数据范围与约定 题目分析 代码示…

建筑工程如何找答案? #职场发展#笔记#职场发展

这些软件以其强大的搜索引擎和智能化的算法&#xff0c;为广大大学生提供了便捷、高效的解题方式。下面&#xff0c;让我们一起来了解几款备受大学生欢迎的搜题软件吧&#xff01; 1.易解题 这是一个网站 是我在百度搜题&#xff0c;经常会出现的一个网站&#xff0c;它里面…

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G题解

题目 在一个果园里&#xff0c;多多已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并&#xff0c;多多可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。可以看出&#xff0c;所…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

数值类型的运算方式总结

提纲1&#xff1a;常见的位运算使用场景 提纲2&#xff1a;整数类型运算时的类型溢出问题&#xff0c;产生原因以及解决办法 提纲3&#xff1a;浮点类型运算时的精度丢失问题&#xff0c;产生原因以及解决办法 数值类型&#xff08;6种&#xff09;分为&#xff1a; 整型&…

跟着pink老师前端入门教程-day27

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

Springboot+vue的大学生智能消费记账系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的大学生智能消费记账系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的大学生智能消费记账系统的设计与实现&#xff0c;采…

165基于matlab的各类滤波器

基于matlab的各类滤波器。汉宁窗设计Ⅰ型数字高通滤波器、切比雪夫一致逼近法设计FIR数字低通滤波器、模拟Butterworth滤波器设计数字低通滤波器、频域抽样法的FIR数字带阻滤波器设计、频域抽样法的FIR数字带通滤波器设计、汉宁窗的FIR数字高通滤波器设计、双线性法设计巴特沃斯…

在python中JSON数据格式的使用

什么是JSON&#xff1f; JSON是一种数据格式&#xff0c;由美国程序设计师DouglasCrockford创建的&#xff0c;JSON全名是JavaScript Object Notation,由JSON英文全文字义我们可以推敲JSON的缘由&#xff0c;最初是为JavaScript开发的。这种数据格式由于简单好用被大量应用在We…

阿里云香港服务器多少钱一年?288元

阿里云香港服务器2核1G、30M带宽、40GB ESSD系统盘优惠价格24元/月&#xff0c;288元一年&#xff0c;每月流量1024GB&#xff0c;多配置可选&#xff0c;官方优惠活动入口 https://t.aliyun.com/U/bLynLC 阿里云服务器网aliyunfuwuqi.com分享阿里云香港服务器优惠活动、详细配…

.netcore音乐播放器 musicPlayer

html音乐播放器 .net core mvc 音乐播放器 支持上传本地音乐到云端 支持通过文件夹创建歌单(不需要数据库和其他数据存储) 通过歌单分类 播放歌曲 支持播放暂停 上一首 下一首切换 支持显示歌曲列表 歌单切换 展示歌曲根据歌单名去获取歌曲显示 功能 版权原因 或者想创建自己的…

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址&#xff0c;指针变量&#xff0c;解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

就是民族的气节

我们拥有一个名字叫中国 - 张明敏 一把黄土塑成千万个你我 静脉是长城 动脉是黄河五千年的文化是生生不息的脉搏&#xff08;齐楚燕韩赵魏秦&#xff09;提醒你 提醒我我们拥有个名字叫中国&#xff08;中原地区为主体&#xff0c;河南&#xff0c;山东&#xff0c;安徽&…

OLMo 以促进语言模型科学之名 —— OLMo Accelerating the Science of Language Models —— 全文翻译

OLMo: Accelerating the Science of Language Models OLMo 以促进语言模型科学之名 摘要 语言模型在自然语言处理的研究中和商业产品中已经变得无所不在。因为其商业上的重要性激增&#xff0c;所以&#xff0c;其中最强大的模型已经闭源&#xff0c;控制在专有接口之中&#…

跨部门协作,是持续绩效管理最有效的手段

跨部门协作是企业管理痛点 一项调查结果显示&#xff0c;企业中普通员工与中层管理者之间&#xff0c;花费在内部沟通上的时间&#xff0c;大约占其工作时间的40%-50%&#xff0c;对于更高层的主管来说这一比例则会更高。 有些工作在部门内沟通完全没问题&#xff0c;但是跨部…