Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C++如何使用STL容器实现队列和栈_创想鸟

C++如何使用STL容器实现队列和栈

C++中使用std::stack和std::queue适配器可高效实现栈和队列,二者默认以std::deque为底层容器,提供语义清晰、类型安全的接口,并支持替换底层容器以优化性能;在多线程环境下需通过互斥锁等机制确保线程安全。

c++如何使用stl容器实现队列和栈

在C++中,要实现队列(Queue)和栈(Stack)这两种基本的数据结构,最简洁、最符合现代C++实践的方式就是利用标准模板库(STL)中提供的适配器容器

std::queue

和

std::stack

。它们并不是全新的数据结构,而是将现有的序列容器(如

std::deque

、

std::list

或

std::vector

)封装起来,只暴露队列或栈特有的操作接口,从而保证了操作的语义正确性。

解决方案

使用

std::queue

和

std::stack

非常直观,它们默认都以

std::deque

(双端队列)作为底层容器,因为

std::deque

在两端插入和删除元素都非常高效。

实现栈 (Stack)

栈是一种“后进先出”(LIFO, Last In, First Out)的数据结构。

std::stack

提供了

push

(入栈)、

pop

(出栈)、

top

(查看栈顶元素)、

empty

(判断是否为空)和

size

(获取元素数量)等操作。

立即学习“C++免费学习笔记(深入)”;

#include #include  // 包含stack头文件#include void demonstrateStack() {    std::stack myStack;    // 入栈操作    myStack.push("Apple");    myStack.push("Banana");    myStack.push("Cherry");    std::cout << "当前栈顶元素: " << myStack.top() << std::endl; // Cherry    // 栈的大小    std::cout << "栈中元素数量: " << myStack.size() << std::endl; // 3    // 遍历并出栈    std::cout << "开始出栈: " << std::endl;    while (!myStack.empty()) {        std::cout << "弹出: " << myStack.top() << std::endl;        myStack.pop();    }    std::cout << "栈是否为空? " << (myStack.empty() ? "是" : "否") << std::endl; // 是}

实现队列 (Queue)

队列是一种“先进先出”(FIFO, First In, First Out)的数据结构。

std::queue

提供了

push

(入队)、

pop

(出队)、

front

(查看队头元素)、

back

(查看队尾元素)、

empty

(判断是否为空)和

size

(获取元素数量)等操作。

#include #include  // 包含queue头文件#include void demonstrateQueue() {    std::queue myQueue;    // 入队操作    myQueue.push(10);    myQueue.push(20);    myQueue.push(30);    std::cout << "当前队头元素: " << myQueue.front() << std::endl; // 10    std::cout << "当前队尾元素: " << myQueue.back() << std::endl;  // 30    // 队列的大小    std::cout << "队列中元素数量: " << myQueue.size() << std::endl; // 3    // 遍历并出队    std::cout << "开始出队: " << std::endl;    while (!myQueue.empty()) {        std::cout << "出队: " << myQueue.front() << std::endl;        myQueue.pop();    }    std::cout << "队列是否为空? " << (myQueue.empty() ? "是" : "否") << std::endl; // 是}

将这两个示例代码放在

main

函数中调用,就能清晰地看到它们的工作方式。

为什么STL选择提供适配器容器,而不是直接使用序列容器?

这是一个很棒的问题,它触及了软件设计中的一个核心原则:接口与实现的分离。STL之所以提供

std::stack

和

std::queue

作为容器适配器,而不是直接让开发者去用

std::vector

或

std::list

模拟,主要有几个深层考量:

首先,语义清晰性。当你看到代码中使用了

std::stack

,你立刻就知道这个数据结构遵循LIFO原则,它的操作(push、pop、top)也严格限定在栈的语义范围内。如果直接用

std::vector

,虽然可以通过

push_back

和

pop_back

实现栈,但

std::vector

还提供了

operator[]

、

insert

、

erase

等大量不符合栈语义的操作。这会模糊代码意图,也可能导致误用,比如不小心从中间插入或删除元素,从而破坏了栈的结构。适配器强制了接口,确保了数据结构的行为符合其定义。

其次,类型安全和约束。适配器容器通过封装底层容器,只暴露了特定数据结构所需的操作。这是一种“最少知识原则”的应用。它降低了出错的可能性,因为你无法执行不属于栈或队列的操作。这在大型项目或团队协作中尤为重要,它为开发者提供了一个明确且受限的接口,减少了心智负担和潜在的bug。

再者,底层实现的可替换性。

std::stack

和

std::queue

允许你指定不同的底层序列容器(如

std::deque

、

std::list

、甚至

std::vector

——尽管

std::vector

作为

std::queue

的底层容器效率不高)。这意味着,如果未来你发现默认的

std::deque

在特定场景下性能不佳,你可以不改变上层逻辑(即栈或队列的操作语义),仅仅通过修改模板参数就能切换到底层容器,比如换成

std::list

。这种灵活性是直接使用单一序列容器无法比拟的。它将“我需要一个栈”和“这个栈应该如何高效地实现”这两个问题解耦了。

所以,与其说STL“没有直接使用”,不如说它提供了一个更高层次的抽象,让开发者能够以更清晰、更安全、更灵活的方式使用这些经典数据结构。这是一种设计上的优雅,它让我们的代码不仅能工作,而且能更好地表达意图。

自定义底层容器:如何选择最适合你的场景?

虽然

std::stack

和

std::queue

默认使用

std::deque

作为底层容器,但在某些特定场景下,我们可能需要根据性能特征来选择

std::list

或

std::vector

。理解它们的优缺点对于做出明智的选择至关重要。

1.

std::deque

(默认选择)

优点:

std::deque

(双端队列)在两端(头部和尾部)插入和删除元素都具有常数时间复杂度O(1)。这是因为

std::deque

在内部通常实现为一系列固定大小的块,这些块的指针存储在一个映射表中,使得它能高效地扩展。这对于栈(只在一端操作)和队列(两端操作)都是理想的。缺点: 相比

std::vector

,

std::deque

的元素不保证存储在连续的内存空间中,这可能导致缓存局部性稍差,在某些对缓存敏感的场景下性能略逊。随机访问(通过

operator[]

)虽然也是O(1),但通常比

std::vector

慢一点。适用场景: 绝大多数情况下,

std::deque

都是

std::stack

和

std::queue

的最佳默认选择。如果你不确定,就用它。

2.

std::list

优点:

std::list

(双向链表)在任何位置插入和删除元素都具有常数时间复杂度O(1),因为它只需要修改前后节点的指针。对于栈和队列,这意味着

push

和

pop

操作效率极高,且不会导致内存重新分配和元素拷贝(这是

std::vector

可能面临的问题)。缺点:

std::list

不支持随机访问(例如

operator[]

),访问元素需要O(n)的时间复杂度。每个元素都需要额外的内存来存储前后节点的指针,导致内存开销较大。缓存局部性极差,因为元素在内存中不连续。适用场景:栈: 如果你的栈需要存储大量元素,并且你非常关心每次

push

/

pop

操作的稳定常数时间性能,且内存重新分配的开销是不可接受的,

std::list

可能是一个选择。队列:

std::list

是实现队列的优秀选择,因为它在头部和尾部插入/删除都非常高效。如果你的队列元素数量变化频繁,且对内存分配和性能的稳定性有较高要求,可以考虑

std::list

。避免: 如果你需要频繁地查看队列或栈的中间元素,或者对内存使用有严格限制,

std::list

不是一个好选择。

3.

std::vector

优点:

std::vector

(动态数组)的元素存储在连续的内存空间中,具有极佳的缓存局部性,随机访问效率最高(O(1))。缺点:作为栈的底层:

std::vector

作为栈的底层容器是高效的,因为

push_back

和

pop_back

(对应栈的

push

和

pop

)通常是O(1)摊销时间。但当容量不足时,

push_back

会导致内存重新分配和所有元素的拷贝,这会带来O(n)的开销。作为队列的底层:

std::vector

作为队列的底层容器效率很低。

push

操作(

push_back

)是高效的,但

pop

操作(从头部删除元素)需要移动所有后续元素,其时间复杂度为O(n)。这使得

std::vector

不适合作为

std::queue

的底层容器。适用场景:栈: 如果你对栈的内存连续性有要求(例如,为了更好的缓存性能),并且可以接受偶尔的O(n)重新分配开销,或者你知道栈的最大容量并能预先

reserve

,那么

std::vector

可以作为

std::stack

的底层容器。避免: 绝对不要将

std::vector

作为

std::queue

的底层容器,除非你的队列几乎从不执行

pop

操作。

如何指定底层容器:

#include #include #include  // 用于作为底层容器#include    // 用于作为底层容器#include   // 默认,但也可以显式指定// 使用std::list作为底层容器的栈std::stack<int, std::list> myStackWithList;// 使用std::vector作为底层容器的栈// 注意:std::vector作为栈的底层,其push_back和pop_back操作是高效的std::stack<int, std::vector> myStackWithVector;// 使用std::list作为底层容器的队列std::queue<int, std::list> myQueueWithList;// 使用std::deque作为底层容器的队列(显式指定,与默认行为一致)std::queue<int, std::deque> myQueueWithDeque;

选择合适的底层容器,需要根据你的具体需求(性能、内存、操作模式)进行权衡。大多数时候,

std::deque

的平衡性使其成为默认的最佳选择,但了解其他选项能帮助你在特定瓶颈出现时进行优化。

在多线程环境中,STL队列和栈的线程安全问题及初步考量

当我们将STL的

std::queue

和

std::stack

引入多线程编程时,一个非常关键且必须严肃对待的问题就是线程安全性。简单来说,

std::queue

和

std::stack

本身并不是线程安全的。这意味着,如果多个线程同时对同一个队列或栈进行

push

、

pop

、

top

/

front

/

back

或

size

等操作,就可能发生数据竞争(data race),导致未定义行为。这包括但不限于数据损坏、程序崩溃、或者得到错误的结果。

为什么它们不是线程安全的?

STL容器的设计哲学是“提供高效且通用的数据结构,将线程安全留给用户去实现”。容器内部的操作,例如在

push

时修改内部指针、分配内存,或者在

pop

时更新状态,这些都不是原子操作。多个线程同时执行这些非原子操作时,它们的执行顺序是不可预测的,可能导致内部状态处于不一致的中间状态。

举个例子,一个线程正在

push

一个元素,它可能已经分配了内存并准备将数据写入,但还没来得及更新容器的大小或尾部指针。此时,另一个线程尝试

pop

,它可能读取到一个过时的大小,或者尝试访问一个尚未完全写入的元素,甚至访问到无效内存。

如何实现线程安全?

要让

std::queue

或

std::stack

在多线程环境下安全地工作,我们通常需要引入同步机制。最常见的方法是使用互斥锁(

std::mutex

)。

一个基本的线程安全队列或栈通常会是这样的:

#include #include #include  // 对于阻塞队列/栈很有用#include           // 用于异常处理// 示例:一个简单的线程安全队列template class ThreadSafeQueue {private:    std::queue q;    mutable std::mutex mtx; // mutable allows const methods to lock    std::condition_variable cv; // 用于等待和通知public:    void push(const T& value) {        std::lock_guard lock(mtx); // 自动加锁解锁        q.push(value);        cv.notify_one(); // 通知一个等待的线程有新数据了    }    T pop() {        std::unique_lock lock(mtx); // 允许在等待时解锁        // 等待直到队列不为空        cv.wait(lock, [this]{ return !q.empty(); });        T value = q.front();        q.pop();        return value;    }    bool try_pop(T& value) { // 非阻塞式pop        std::lock_guard lock(mtx);        if (q.empty()) {            return false;        }        value = q.front();        q.pop();        return true;    }    bool empty() const {        std::lock_guard lock(mtx);        return q.empty();    }    size_t size() const {        std::lock_guard lock(mtx);        return q.size();    }};// 线程安全栈的实现类似,只是操作接口不同

初步考量和注意事项:

互斥锁的粒度: 上述示例中,每个操作都加锁,这是最直接的实现方式。但如果操作非常频繁且锁竞争激烈,这可能成为性能瓶颈。在某些高级场景中,可能会考虑更细粒度的锁,或者无锁(lock-free)数据结构,但这会显著增加实现的复杂性。阻塞与非阻塞:

pop

操作可能需要等待队列中有元素。上面的

pop

方法是阻塞的(使用

std::condition_variable

),即如果没有元素,调用线程会等待直到有元素可用。你也可以提供一个非阻塞的

try_pop

方法,如果队列为空则立即返回一个指示(例如

false

)。异常安全: 确保在操作过程中抛出异常时,锁能够正确释放。

std::lock_guard

和

std::unique_lock

是RAII(Resource Acquisition Is Initialization)的典范,它们能够自动管理锁的生命周期,非常适合处理异常。

top()

/

front()

的陷阱: 如果一个线程调用

top()

或

front()

获取了栈顶/队头元素,但在它使用这个元素之前,另一个线程执行了

pop

操作,那么之前获取的元素可能已经失效,或者它所指向的内存已被释放或重用。因此,通常建议将

pop

和获取元素合并为一个操作,或者确保在获取元素后立即使用。我的

pop

示例就是返回了值,避免了这个问题。死锁风险: 如果你的线程安全容器与其他锁或资源交互,需要警惕死锁的风险。始终保持一致的加锁顺序,或者使用

std::lock

配合

std::adopt_lock

等高级技术。

在实际项目中,尤其是在高性能或高并发场景,直接手写一个完美无缺的线程安全容器是很有挑战的。通常,我们会倾向于使用成熟的并发库,例如Intel TBB (Threading Building Blocks) 中的

concurrent_queue

,或者Boost库中的并发容器,它们提供了经过充分测试和优化的线程安全数据结构。但理解其底层原理和如何使用

std::mutex

、

std::condition_variable

来构建,是掌握现代C++并发编程的基础。

以上就是C++如何使用STL容器实现队列和栈的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1476254.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++11如何使用std::shared_ptr实现资源共享
上一篇 2025年12月19日 00:05:42
C++内存模型与指令重排影响分析
下一篇 2025年12月19日 00:05:53

相关推荐

  • 自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法

    自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法自媒体如何利用节日营销_利用节日进行自媒体营销的实用方法

    节日营销需提前策划主题内容、打造专属视觉风格、发起互动活动、联合账号推广并推出限时福利,通过预热内容、统一设计、用户参与、跨界合作与专属优惠增强粉丝粘性并扩大影响力。 当节日临近时,用户对相关内容的关注度显著提升,自媒体平台上的互动和流量通常会出现明显增长。抓住这一时机进行有针对性的内容策划与推广,…

    2026年9月25日 • 用户投稿
    000
  • AI图片优化修复有哪些 AI图片优化修复工具汇总

    AI图片优化修复有哪些 AI图片优化修复工具汇总AI图片优化修复有哪些 AI图片优化修复工具汇总AI图片优化修复有哪些 AI图片优化修复工具汇总AI图片优化修复有哪些 AI图片优化修复工具汇总

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 吐司AI高清 由吐司AI开发的图像清晰化与修复服务 绘蛙AI高清 绘蛙平台推出的AI图像高清修复功能 稿定AI变清晰 稿定设计提供的AI图像清晰增强处理工具 Facet 用于AI图像修饰和质量提…

    2026年9月25日 • 用户投稿
    000
  • 苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口

    苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口

    苹果壁纸设计网页正版访问入口是http://eyu.zaixian-fanyi.com/fan_wei_13269529,该平台提供海量高清壁纸、支持用户上传分享、内置编辑工具并定期更新主题内容,界面简洁流畅,支持一键收藏与多设备同步,同时整合设计模板、贴纸素材与艺术字体,提升创作灵活性。 苹果壁纸…

    2026年9月25日 • 用户投稿
    000
  • 夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程

    夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程

    首先访问夸克官网下载电脑版安装包,运行QuarkSetup.exe完成安装并创建快捷方式,最后启动浏览器登录阿里系账号同步数据并进行个性化设置。 如果您尝试在电脑上使用夸克浏览器,但尚未安装其桌面版本,则需要完成下载与安装流程。以下是解决此问题的步骤: 本文运行环境:联想小新Air 14,Windo…

    2026年9月25日 • 用户投稿
    000
  • safari浏览器如何管理和删除Cookie_safari浏览器Cookie管理和删除方法

    清除或管理Safari浏览器的Cookie可解决网页加载异常、登录状态丢失等问题。1、通过“设置-隐私-管理网站数据”可查看并删除特定网站的Cookie;2、点击“移除全部”可彻底清除所有Cookie,重置浏览状态;3、勾选“阻止所有Cookie”能增强隐私保护,但会影响网站正常功能;4、使用“无痕…

    2026年9月25日
    100
  • 使用 DynamoDBMapper 进行条件更新操作

    使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作

    本文将介绍如何利用 DynamoDBMapper 在 Java 中执行基于当前值的条件更新操作,特别是使用 “ADD” 操作来递减账户余额。虽然 DynamoDBMapper 默认不支持直接使用更新表达式,但通过配置 SaveBehavior,可以实现类似的效果。 Dynam…

    2026年9月25日 • 用户投稿
    000
  • 大智慧app怎么清空缓存数据_大智慧app缓存数据清理步骤

    大智慧app怎么清空缓存数据_大智慧app缓存数据清理步骤大智慧app怎么清空缓存数据_大智慧app缓存数据清理步骤大智慧app怎么清空缓存数据_大智慧app缓存数据清理步骤大智慧app怎么清空缓存数据_大智慧app缓存数据清理步骤

    清理大智慧App缓存可提升运行效率,释放存储空间。首先可通过“我的”→“设置”→“缓存清理”清除临时文件;如需彻底清理,可进入“数据清除”选择“全部清除”,但会删除账户设置与交易记录;若仅需清除特定数据,可选“清除委托交易账户信息”进行精准操作。 如果您在使用大智慧App时遇到运行卡顿、加载缓慢或存…

    2026年9月25日 • 用户投稿
    000
  • 解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    本文旨在解决JavaFX应用在Eclipse中正常运行,但导出为可运行JAR包后,因FXMLLoader无法找到FXML资源文件而抛出IllegalStateException: Location is not set异常的问题。核心解决方案是调整FXMLLoader.setLocation()方法…

    2026年9月25日 • 用户投稿
    100
  • iQOO Z10 Turbo+ 续航登顶各大榜单 8000mAh 电池绝了

    iQOO Z10 Turbo+ 续航登顶各大榜单 8000mAh 电池绝了iQOO Z10 Turbo+ 续航登顶各大榜单 8000mAh 电池绝了iQOO Z10 Turbo+ 续航登顶各大榜单 8000mAh 电池绝了iQOO Z10 Turbo+ 续航登顶各大榜单 8000mAh 电池绝了

    8 月 4 日,iqoo 产品团队公布了 iqoo z10 turbo+ 的续航测试成绩,该机凭借出色的续航表现强势登顶多家主流媒体榜单,引发广泛关注。搭载 8000mah 超大容量蓝海电池与联发科最新旗舰芯片天玑 9400+,iqoo z10 turbo+ 成为兼顾高性能与持久续航用户的理想之选。…

    2026年9月25日 • 用户投稿
    100
  • 快手 Kwaipilot 团队发布两款 KAT 系列 Agentic Coding 大模型

    快手 Kwaipilot 团队发布两款 KAT 系列 Agentic Coding 大模型快手 Kwaipilot 团队发布两款 KAT 系列 Agentic Coding 大模型快手 Kwaipilot 团队发布两款 KAT 系列 Agentic Coding 大模型快手 Kwaipilot 团队发布两款 KAT 系列 Agentic Coding 大模型

    快手 kwaipilot 团队近日推出了两款全新的 kat 系列 agentic coding 大模型,标志着在代码智能领域的重大突破:开源的 32b 参数模型 kat-dev-32b 以及闭源的旗舰级模型 kat-coder。 据悉,这两款模型在代码理解与生成方面分别展现了卓越的轻量化性能与顶级的…

    2026年9月25日 • 用户投稿
    200
  • Deepseek 满血版联合 Scribble Diffusion Pro,绘制专业级图像​

    Deepseek 满血版联合 Scribble Diffusion Pro,绘制专业级图像​Deepseek 满血版联合 Scribble Diffusion Pro,绘制专业级图像​Deepseek 满血版联合 Scribble Diffusion Pro,绘制专业级图像​Deepseek 满血版联合 Scribble Diffusion Pro,绘制专业级图像​

    使用deepseek满血版配合scribble diffusion pro可高效进行专业图像创作。1. scribble diffusion pro是基于草图生成高质量图像的插件,适合已有初步构图的创作者;2. deepseek提供更强文本理解与细节控制能力,提升风格、光影等描述精准度;3. 高效使…

    2026年9月25日 • 用户投稿
    200
  • 快手如何设置动态封面_快手动态封面设置的步骤与技巧

    快手如何设置动态封面_快手动态封面设置的步骤与技巧快手如何设置动态封面_快手动态封面设置的步骤与技巧快手如何设置动态封面_快手动态封面设置的步骤与技巧快手如何设置动态封面_快手动态封面设置的步骤与技巧

    1、可通过长按主页背景选择相册视频设置动态封面;2、需在通用设置中开启动态封面功能;3、也可从视频分享页点击动态壁纸快速应用。 如果您在快手个人主页希望展示更具吸引力的动态封面,以替代静态图片,可以通过特定步骤进行设置。该功能允许用户使用短视频作为主页背景,提升个性化展示效果。 本文运行环境:iPh…

    2026年9月25日 • 用户投稿
    200
  • Java多态中成员变量是否具有动态绑定特性

    成员变量不具有动态绑定特性,其访问基于引用变量的声明类型而非实际对象类型。例如,当父类和子类存在同名成员变量时,通过父类引用访问该变量将获取父类中的值,即使实际对象是子类实例。这体现了静态绑定,即在编译期确定访问的变量。相比之下,实例方法支持动态绑定(后期绑定),在运行时根据对象的实际类型决定调用哪…

    2026年9月25日
    100
  • 摩尔线程科创板上市 IPO 已过会,冲刺“国产 GPU 第一股”

    摩尔线程科创板上市 IPO 已过会,冲刺“国产 GPU 第一股”摩尔线程科创板上市 IPO 已过会,冲刺“国产 GPU 第一股”摩尔线程科创板上市 IPO 已过会,冲刺“国产 GPU 第一股”摩尔线程科创板上市 IPO 已过会,冲刺“国产 GPU 第一股”

    2025 年 9 月 26 日,上交所官方网站信息显示,摩尔线程智能科技(北京)股份有限公司(简称“摩尔线程”)的科创板 ipo 项目已顺利通过上市委审议,保荐机构为中信证券股份有限公司。 从正式提交申请获上交所受理,到成功过会,摩尔线程历时不足三个月,创下科创板企业上市审核速度的新纪录。本次IPO…

    2026年9月25日 • 用户投稿
    100
  • 2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    根据 idc 最新发布的数据,2025 年上半年中国蓝牙耳机市场出货量约为 5998 万台,同比增长 7.5%。其中,小米以 16.5% 的市场份额位居榜首。值得注意的是,耳夹式耳机在 2025 年上半年的市场规模与增速首次超越耳挂式产品,实现出货量 651 万台,同比增长高达 41.0%。 小米耳…

    2026年9月25日 • 用户投稿
    200
  • Java 中处理货币数据的正确方式

    Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式Java 中处理货币数据的正确方式

    在 Java 应用程序中,尤其是在处理财务数据时,选择正确的数据类型至关重要。货币数据通常以特定的格式呈现,例如包含货币符号(如美元符号 $)和千位分隔符(如逗号 ,)。直接将这些数据映射到 DTO 类时,我们需要仔细考虑数据类型的选择,以避免潜在的精度损失和计算错误。 货币数据类型选择考量 常见的…

    2026年9月25日 • 用户投稿
    000
  • 夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置

    夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置夸克怎么关闭自动打开淘宝_夸克禁止跳转第三方App设置

    关闭夸克浏览器“允许打开第三方应用”权限可解决跳转问题。依次进入设置→浏览器偏好→关闭该选项;同时在系统设置中将淘宝等App的链接打开方式设为“不打开”或“询问”;搜索时长按结果选择“在浏览器中打开”;使用无痕浏览模式避免唤端行为。 如果您在使用夸克浏览器时,点击链接后自动跳转到淘宝等第三方App,…

    2026年9月25日 • 用户投稿
    100
  • 如何在Debian上检测Nginx SSL状态

    在debian系统上检测nginx的ssl状态,可以通过以下几种方法进行: 使用Nginx命令行工具:打开终端,输入以下命令来检查Nginx的SSL配置是否正确: sudo nginx -t -c /etc/nginx/nginx.conf 这个命令会测试Nginx配置文件的语法是否正确,并且会显示…

    2026年9月25日
    000
  • AI思维导图工具有哪些_好用的AI思维导图工具大全

    AI思维导图工具有哪些_好用的AI思维导图工具大全AI思维导图工具有哪些_好用的AI思维导图工具大全AI思维导图工具有哪些_好用的AI思维导图工具大全AI思维导图工具有哪些_好用的AI思维导图工具大全

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ TreeMind树图:新一代AI智能思维导图,一句话生成思维导图 博思白板:博思云创推出的AI多功能白板工具 ProcessOn:在线AI流程图和思维导图制作工具 自由画布:百度文库和百度网盘联…

    2026年9月25日 • 用户投稿
    000
  • 幕布新手入门教程:从零开始创建你的第一个文档

    幕布新手入门教程:从零开始创建你的第一个文档幕布新手入门教程:从零开始创建你的第一个文档幕布新手入门教程:从零开始创建你的第一个文档幕布新手入门教程:从零开始创建你的第一个文档

    首先注册登录幕布账号,进入主界面后点击新建文档并输入标题,通过回车创建节点、Tab键调整层级,利用快捷键提升效率,最后插入待办、加粗、链接等富文本内容完成结构化笔记。 如果您刚刚开始使用幕布,想要快速上手并创建属于自己的第一份结构化文档,可以通过以下步骤完成基础操作。幕布以大纲笔记为核心,帮助用户高…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信