C++ STL之deque详解:从使用到底层,再到面试八股

C++ 面试八股文总结 -- STL 阅读详情

C++ STL之deque详解:从使用到底层,再到面试八股

本文面向面试和日常开发,先讲调用,再讲原理,最后给口语化面试答案。


一、用法速查

1.1 头文件与初始化

#include <deque>
#include <iostream>
#include <string>
using namespace std;

int main() {
    deque<int> dq1;                      // 空deque
    deque<int> dq2(5);                   // 5个元素,默认0
    deque<int> dq3(5, 1);                // 5个1
    deque<int> dq4{10, 20, 30, 40};      // 初始化列表
    deque<int> dq5(dq4);                 // 拷贝构造

    for (int x : dq4) cout << x << " ";  // 10 20 30 40
}

1.2 元素访问

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

int main() {
    deque<int> dq{10, 20, 30, 40, 50};

    cout << dq[0] << "\n";               // 10,不检查越界
    cout << dq.at(1) << "\n";            // 20,越界抛 out_of_range
    cout << dq.front() << "\n";          // 10
    cout << dq.back() << "\n";           // 50
}

1.3 两端操作

所有四端操作都是 O(1)——这是 deque 的核心优势。

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

void print(const deque<int>& dq) {
    for (int x : dq) cout << x << " ";
    cout << "\n";
}

int main() {
    deque<int> dq;

    dq.push_back(10);
    dq.push_back(20);
    dq.push_front(5);
    dq.push_front(1);
    print(dq);                           // 1 5 10 20

    dq.pop_back();
    print(dq);                           // 1 5 10

    dq.pop_front();
    print(dq);                           // 5 10
}

1.4 中间插入与删除

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

void print(const deque<int>& dq) {
    for (int x : dq) cout << x << " ";
    cout << "\n";
}

int main() {
    deque<int> dq{10, 20, 30, 40, 50};

    auto it = dq.begin() + 2;
    dq.insert(it, 99);                   // 在20和30之间插入99
    print(dq);                           // 10 20 99 30 40 50

    dq.erase(dq.begin() + 1);            // 删除20
    print(dq);                           // 10 99 30 40 50

    dq.erase(dq.begin() + 1, dq.begin() + 3);  // 删除 [99, 30)
    print(dq);                           // 10 40 50
}

注意:deque 的中间插入/删除是 O(n),因为需要移动插入点所在块以及后续所有块的元素——后面的面试题会细讲。

1.5 大小操作

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

int main() {
    deque<int> dq{1, 2, 3, 4, 5};

    cout << dq.size() << "\n";           // 5
    cout << dq.empty() << "\n";          // 0 (false)

    dq.resize(3);                        // 只保留前3个
    cout << dq.size() << "\n";           // 3
    for (int x : dq) cout << x << " ";   // 1 2 3
    cout << "\n";

    dq.resize(5, 99);                    // 扩充到5,新元素填99
    for (int x : dq) cout << x << " ";   // 1 2 3 99 99
    cout << "\n";

    dq.clear();
    cout << dq.size() << "\n";           // 0
}

与 vector 的显著区别:

// deque 没有这两个函数——编译错误
// dq.capacity();   // ❌
// dq.reserve(100); // ❌

deque 没有 capacity() 和 reserve(),因为它的分段连续结构不需要整体搬移——底层原理部分解释原因。

1.6 遍历与排序

#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    deque<int> dq{5, 1, 4, 2, 3};

    // 迭代器遍历
    for (auto it = dq.begin(); it != dq.end(); ++it)
        cout << *it << " ";              // 5 1 4 2 3
    cout << "\n";

    // 范围for
    for (int x : dq) cout << x << " ";
    cout << "\n";

    // 反向迭代器
    for (auto it = dq.rbegin(); it != dq.rend(); ++it)
        cout << *it << " ";              // 3 2 4 1 5
    cout << "\n";

    // sort排序——deque支持随机访问迭代器,可以调用std::sort
    sort(dq.begin(), dq.end());
    for (int x : dq) cout << x << " ";   // 1 2 3 4 5
    cout << "\n";
}

1.7 函数速查表

方法含义复杂度
dq[i]下标访问,不检查越界O(1)
dq.at(i)带边界检查,越界抛异常O(1)
front() / back()队首/队尾元素O(1)
push_front(v) / push_back(v)首/尾插入O(1)
pop_front() / pop_back()首/尾删除O(1)
insert(pos, v)中间插入O(n)
erase(pos) / erase(first, last)中间删除O(n)
size() / empty()大小/判空O(1)
resize(n)改变大小O(n)
clear()清空O(n)
begin() / end()迭代器O(1)

二、底层原理

2.1 分段连续存储结构

deque 的底层既不是 vector 的整块连续内存,也不是 list 的完全离散节点。它采用了一种巧妙的折中——分段连续存储(segmented contiguous storage)。

                      中控器 (map)
              ┌──────────────────────────┐
              │  ptr  │  ptr  │  ptr  │ … │
              └───┬───┴───┬───┴───┬───┴──┘
                  │       │       │
            ┌─────┘       │       └─────┐
            ▼             ▼             ▼
        ┌──────┐     ┌──────┐     ┌──────┐
        │   2   │     │  25  │     │   8  │
        │  10   │     │  30  │     │  12  │
        │  15   │     │  35  │     │   —  │
        │  20   │     │   —  │     │   —  │
        └──────┘     └──────┘     └──────┘
         buffer0      buffer1      buffer2
          (块0)        (块1)        (块2)

数据被切分成若干个固定大小的块(buffer),每个块内部是连续内存。块与块之间不连续,但通过一个中控器(通常称作 map,实际上是指针数组)来串联管理。

2.2 operator[] 的两步寻址

当你执行 dq[i] 时,deque 内部通过两步找到真正的内存位置:

block_index = i / block_size
offset      = i % block_size
result      = map[block_index][offset]   // 等价于 *(map[block_index] + offset)

以 dq[3] 为例,如果块大小是 4:

block_index = 3 / 4 = 0
offset      = 3 % 4 = 3
→ 取 map[0] 指向的块,再取该块第 3 个位置

这个两步寻址就是 O(1) 的——一次数组索引 + 一次指针偏移,没有循环。

2.3 块大小

块大小依赖实现,一般规则是:

// 典型实现(gcc/libstdc++)
static const size_t block_size = max(1, 512 / sizeof(T));
  • 对于 int(4 字节):512 / 4 = 128 个元素每块
  • 对于 double(8 字节):512 / 8 = 64 个元素每块
  • 对于自定义大对象(sizeof > 512):每块只放 1 个元素

512 字节是常见的内存页对齐值,由 malloc 的元数据效率决定。

2.4 push_front / pop_front 为何是 O(1)

vector 的 push_front 是 O(n) 的,因为需要把所有元素后移一位。但 deque 的分段连续结构完美解决了这个问题:

块0(头部有空位)          块1             块2
┌──────┬──┐          ┌──────┐          ┌──────┐
│  —   │ 5 │←front   │  10  │          │  20  │
│  —   │ 3 │          │  15  │          │  25  │
│  —   │ 1 │          │   —  │          │   —  │
│  —   │ 2 │          │   —  │          │   —  │
└──────┴──┘          └──────┘          └──────┘

每个块在两端都预留了空间。执行 push_front 时:

  1. 如果当前首块前端还有空位,直接在该块的前一个槽位写入
  2. 如果首块前端已满,新分配一个块放到中控器前端,在新块尾部写入

pop_front 对称——直接移动首块内的起始指针,如果整块元素全 pop 完,释放该块。

这就是为什么 deque 两端操作能保持 O(1):不需要搬移已有元素,只需要操作首尾块的空位或分配释放块。

2.5 deque vs vector vs list 三维对比

维度dequevectorlist
内存布局分段连续(多块)整块连续节点离散,指针连接
随机访问O(1)(两步寻址)O(1)(直接偏移)O(n)(逐个遍历)
头插/头删O(1)O(n)(整体后移)O(1)
尾插/尾删O(1)O(1)(均摊)O(1)
中间插入/删除O(n)O(n)O(1)(有迭代器时)
缓存局部性中等(块内连续)最佳(整块连续)差(离散节点)
迭代器失效(插入)仅两端操作不失效可能全部失效仅被删节点失效
有 capacity/reserve无有无
默认底层(stack/queue)自身——

2.6 为什么 deque 没有 capacity 和 reserve

vector 有 capacity() 是因为它的底层是一整块连续内存——当容量不够时必须整体搬迁,reserve 可以预分配来减少扩容次数。

deque 不需要这两个函数,根本原因在于它的 分段结构:

  • push_back 时当前尾块满了,只需分配一个新块挂到中控器尾部,不需要搬移已有元素
  • push_front 同理,满则分配新块挂到头部
  • 没有"整体扩容"的概念——每次分配的都是单个小块的尺寸,无需整体搬迁

所以 deque 不需要预知最终大小来预留空间。如果一定要预留,用 resize 即可。

2.7 为什么 stack 和 queue 默认底层是 deque

template <class T, class Container = deque<T>>
class stack;

template <class T, class Container = deque<T>>
class queue;

stack 需要一端插入 + 一端删除;queue 需要一端插入 + 另一端删除。deque 刚好对两端操作都是 O(1),而且支持随机访问(虽然 adapter 不暴露这个能力)。相比之下,vector 只有尾部高效(push_front O(n)),list 虽然两端也快但缓存不友好且节点内存开销大。deque 是对 adapter 来说最均衡的选择。


三、面试题 + 口语化答案

Q1:deque 底层是什么数据结构?

“deque 底层是分段连续存储——由一个中控器(指针数组)管理多个固定大小的连续内存块。每个块内部是连续的,块与块之间不连续。访问元素时通过两步寻址:map[block_index] + offset,两次指针偏移就到目标位置了。这个结构让 deque 同时做到了两端 O(1) 操作和随机访问 O(1)——相当于在 vector 和 list 之间取了一个折中。”

map[0]

块0
[2, 10, 15, 20]

map[1]

块1
[25, 30, 35, ...]

map[2]

块2
[8, 12, ...]

map[...]

...

Q2:为什么 deque 没有 capacity() 和 reserve()?

“因为 deque 不需要整体搬移。vector 需要 reserve 是因为当整块连续内存不够时必须整体扩容——搬迁所有元素到新内存。deque 是分段连续的,尾块满了就分配一个小块挂到中控器尾部,头块满同理。每块大小是固定的,每次只分配一小块,不存在 vector 那种 ‘一次性搬走所有元素’ 的大扩容。所以 capacity 和 reserve 对 deque 没有意义——用 resize 预占位就行。”

Q3:deque 的迭代器和 vector 的迭代器有什么不同?

“两个核心区别。第一,大小不同——vector 的迭代器可以就是一个 T* 指针,8 字节就够(x64)。deque 的迭代器至少包含三个字段:当前元素的指针、当前所在块的指针、中控器的位置指针,在 GCC 里大约 16-24 字节。第二,失效规则不同——vector 只要触发扩容或中间插入删除,从操作位置往后的迭代器全部失效;deque 只在中间插入删除时失效,两端的 push/pop 操作不影响已有迭代器(push_front 和 push_back 不失效)。”

Q4:什么时候用 deque 而不是 vector?

“典型的场景是需要在两端频繁操作——比如任务队列、滑动窗口、双端 BFS。如果大部分操作是 push_back + 随机访问,那就用 vector。如果要在头部频繁 push/pop,vector 是 O(n) 的扛不住,list 随机访问太慢,deque 是刚好合适的选择。另外如果不想处理 vector 的那个 vector<bool> 特化陷阱,也可以用 deque<bool> 替代——deque 没有 bool 特化,返回的是真的 bool&。”

Q5:deque 中间插入为什么是 O(n)?

“这个 O(n) 和 vector 的 O(n) 性质不同。vector 的中间插入 O(n) 是因为需要把插入点之后的所有元素后移一位——一次连续的 memmove。deque 的插入也是 O(n),但原因是分段连续结构下的块间元素挪动:假设你在块 2 的某个位置插入了元素,块 2 在这个插入点之后的元素要往后挪;如果块 2 满了,最后一个元素要移到块 3 的头部,然后块 3 的所有元素顺次后移,以此类推——相当于把插入点后面的所有分段依次往后推了一个位置。如果面试官追问能不能比 vector 快,可以说不一定——vector 的 memmove 流水线友好,deque 的跨块挪动涉及多次拷贝且破坏缓存连续,实际常数可能更大。”

Q6:deque 的块大小在不同平台下是多少?

“块大小取决于实现,GCC libstdc++ 和 Clang libc++ 采用的是 max(1, 512 / sizeof(T))——512 字节除元素类型大小,至少为 1。对于 int 是 128 个元素每块,double 是 64 个。MSVC 的实现略有不同,但整体思路一致——用 512 字节这个对齐边界是因为现代 malloc 对 512 字节以下的小块分配效率最高,且能最小化内存碎片。这个常数是编译器决定的,标准没有强制,但主流实现大同小异。”

Q7:deque 中间插入后迭代器失效的范围是多大?

“只在被插入/删除位置所在的块以及之后的所有块中,迭代器才有可能失效。具体来说,如果你插入的是整个 deque 的中间位置,从插入点开始到末尾的所有迭代器都可能失效——因为后续的元素在块内挪动了位置。不像 vector 那么极端(扩容就全死),但比 list 严重(list 只死被删的那个)。另外两端的 push/pop 不会让任何已有迭代器失效——这是 deque 的一个优势。”

Q8:deque 和 list 都是两端操作高效,为什么 stack/queue 选 deque 作为默认底层?

“两个原因。第一,随机访问——list 的迭代器是双向的,不支持随机访问(所以 list 不能传给 std::sort);deque 的迭代器是随机访问的,虽然 adapter 不会暴露这个能力,但内部实现可以用 operator[] 做更高效的处理。第二,内存效率——list 每个节点都要存储 prev 和 next 两个指针,加上元素数据,额外开销差不多 16 字节(x64)。deque 按块分配,块内元素没有任何额外指针开销。数据量大时 deque 的内存占用比 list 少很多。所以 deque 是 adapter 的那个 ‘最均衡’ 的选择。”


一句话总结:deque 通过分段连续存储在中插 O(n) 的代价下换来了两端 O(1) 和随机访问 O(1) 的双重收益,是 vector 和 list 之间的最佳折中——它的迭代器结构、无 capacity 的设计、以及作为 stack/queue 默认底层的选择,都是面试中值得展开聊的考点。

c++面试八股文(大公司通用) 在C++面试中,常见的问题通常会围绕C++的基础知识、数据结构与算法、系统设计、编程技巧、以及实际应用中的场景。以下是华为C++面试中常见的“八股文”问题及其简要回答思路。C++中的用法有哪些? 回答:C++中构造函数和析构函数的执行顺序? 回答:C++中指针的作用是什么? 回答:C++中的深拷贝与浅拷贝区别? 回答:C++的多态性是如何实现的? 回答:什么是虚析构函数,为什么需要它? 回答:接口类和抽象类的区别是什么? 回答:C++中内存分配方式有哪些? 回答:智能指针的作用和类型? 回答:C++中的RA 阅读详情

相关推荐

C++ STL容器适配器:stack与queue的底层实现与deque设计原理

容器适配器是C++标准模板库(STL)中一种重要的设计模式,它通过封装现有容器并提供受限接口来实现特定数据结构行为。其核心原理在于代码复用与接口转换,技术价值在于实现了职责分离与灵活性,允许开发者基于不同底层容器构建栈(LIFO)和队列(FIFO)等抽象数据类型。在工程实践中,deque(双端队列)因其两端高效操作特性,成为stack和queue默认的底层容器,完美平衡了内存效率与缓存友好性。理解容器适配器与deque的分段连续内存结构,有助于优化数据结构选择,提升程序性能,尤其在需要频繁头尾操作的场景中。

weixin_42525637的博客 358

C++面试八股文快问快答のSTL篇

STL篇 vector的底层原理(此题本人踩坑,需重视) vector底层是一个动态数组,包含三个迭代器,start和finish之间是已经被使用的空间范围,end_of_storage是整块连续空间包括备用空间的尾部。 当空间不够装下数据(vec.push_back(val))时,会自动申请另一片更大的空间(1.5倍或者2倍),然后把原来的数据拷贝到新的内存空间,接着释放原来的那片空间[vector内存增长机制]。 当释放或者删除(vec.clear())里面的数据时,其存储空间不释放,仅仅是清空了里面的

谁吃薄荷糖 2498

C++面试八股-STL(queue)

queue(队列)在stl里面不是一个基础的容器(container),而是一个适配器(adapter),一般是封装了其他的基础容器作为存储基础。在stl里面,stl::queue是基于stl:deque双端队列来实现的,不过根据queue先进先出以及首尾快速存取的数据结构特点,也可以基于list进行实现,而不推荐vector之类的数组实现——因为在vector头部的插入或者删除速度过慢。根据STL之queue容器详解_std::queue-优快云博客。

int_p的博客 533

大厂面试八股文——STL

文章目录STL理解STL空间适配器sort1.vetcor2.list双向链表3.deque双向队列3.1.stack()堆3.2.queue队列4.红黑树RB-tree4.1 set、multiset4.2 map、multimap5 hashtablehashtable(哈希表)vector和list的区别unordered_map和map的区别算法equal STL理解 ① 长久以来,软件界一直希望建立一种可重复利用的东西。 ② C++的面向对象和泛型编程思想,目的就是复用性的提升。 ③ 大多数情况下

xiaohu的博客 2148

C++栈与队列:从STL使用到底层模拟实现全解析

栈和队列是计算机科学中两种基础且核心的线性数据结构,分别遵循后进先出(LIFO)和先进先出(FIFO)的原则。其底层实现原理深刻影响着程序的性能与内存管理。在C++开发中,标准模板库(STL)提供了现成的stack和queue容器适配器,极大提升了开发效率。然而,深入理解其作为容器适配器的本质、底层默认依赖deque的原因,以及手动模拟实现数组与链表版本的过程,对于掌握C++内存管理、异常安全及编写高性能代码至关重要。这种从使用到实现的理解跃迁,不仅能帮助开发者应对C++面试中关于数据结构深度的考察,更能使

weixin_30402231的博客 341

C++ STL容器底层原理与性能优化实战指南

在C++编程中,标准模板库(STL)是构建高效应用的核心基础。其设计哲学基于泛型编程,通过容器、迭代器、算法三大组件实现数据结构和算法的解耦。容器作为数据存储的核心,其底层数据结构(如动态数组、红黑树、哈希表)直接决定了操作的时间复杂度和内存布局。理解这些原理对于编写高性能代码至关重要,例如掌握vector的扩容机制和迭代器失效规则,能有效避免性能陷阱和未定义行为。在实际工程中,合理选择容器类型(如vector、map、unordered_map)并结合预分配(reserve)、emplace操作等技巧,可

weixin_33226548的博客 310

C++面试八股文:std::deque用过吗?

的底层容器,让我们比较一下三个容器的差异:(只考虑头插和尾插,因为stack不需要随机插入)二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用。中还有未被元素填充的位置,则将元素填充到数组中,如果此指针指向的。今天的面试分享到这里就结束了,让我们继续期待二师兄的表现吧。从上表中看到,三种容器的插入和是删除的时间复杂度相同。,插入要分情况,如果是头插和尾插,时间复杂度为。会找到头部或尾部的指针,并通过指针找到对应的。二师兄:说实话,很少用,基本没用过。,需要随机插入和删除的时候可以使用。

binarch的博客 135

【八股】基于STL实现的笔试题常考七大基本数据结构

C++笔试题常考七大数据结构总结,均基于STL实现

ericma12的博客 715

C++ STL面试八股:从vector扩容到红黑树,底层原理全拆解

C++开发岗位面试中,STL几乎是必考环节。不少候选人能熟练调用容器和算法,却在“vector为什么按1.5倍或2倍扩容”“map为何选用红黑树而非AVL树”“迭代器何时失效”这类底层追问前卡壳。从数据结构选型到内存管理,从移动语义到异常安全,STL的设计处处体现着性能与工程可维护性的权衡。理解这些原理不仅能帮助通过技术面试,更能指导日常开发中容器与算法的合理选用。本文基于高频面试考点,拆解vector扩容机制、红黑树与哈希表的取舍、迭代器失效规则、sort的内省排序实现,以及C++11以后移动语义带来的性

weixin_33404102的博客 229

STL底层原理与高频面试考点全解析:从容器到迭代器失效

STL是C++开发与面试中的核心知识体系,它涵盖vector、deque、map等经典容器与配套算法。理解vector扩容机制、deque分段连续结构、红黑树有序性等底层原理,是掌握迭代器失效规则和内存管理的关键。STL的设计体现了性能与工程取舍的统一:空间配置器减少内存碎片,std::sort通过IntroSort融合多种排序策略,保证最坏情况下的效率。这些技术被广泛应用于高性能服务、缓存系统、日志分析等真实场景。在工程实践中,合理选择容器、规避迭代器失效陷阱,是C++工程师的基本能力。本文从容器底层到算

weixin_28700411的博客 234

C++ STL容器深度解析:list与deque原理、性能对比与实战应用

在C++标准模板库中,容器是构建高效程序的基础数据结构。理解不同容器的底层实现原理,是进行性能优化和正确选型的关键。链表结构通过节点指针连接实现元素的离散存储,其优势在于任意位置的常数时间插入与删除,但代价是随机访问效率低下且缓存不友好;而双端队列采用分段连续的数组结构,在保证头尾高效操作的同时,提供了接近常数的随机访问能力,是连续存储与链表特性的折中方案。这些特性直接决定了它们的技术价值:list适用于元素移动成本高、迭代器稳定性要求严苛的场景,如LRU缓存;deque则擅长作为需要双向扩展的队列或缓冲区

weixin_29698641的博客 315

C++面试八股文:用过STL吗?

首先是分配器,主要是为容器分配管理内存的。其次是迭代器,是容器和算法的桥梁。再次是仿函数,一般用作算法中,适配器提供各种粘合剂的功能,把不同部件之间的接口连接起来。二师兄:分配器主要用于内存的分配与释放。中做很多事情,比如我们可以统计申请和释放内存的总量,可以申请一块大内存做内存池等等。二师兄的C++面试之旅,明天继续。二师兄:STL中容器的数量比较多,按照类型可以分为顺序容器和关联容器。,通过调用容器的接口,实现适配器所需的功能。二师兄:(每天都用好吗。

binarch的博客 179

【华为OD技术面试手撕真题】- C++手撕技术面试八股文(3)

【华为OD技术面试手撕真题】- C++手撕技术面试八股文(3) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2025年最新题

KJ.JK 1万+

嵌入式面试高频!!!C语言(十四) STL(嵌入式八股文)

本文对比分析了常见数据结构的特点与实现:1. List(链表)与Vector(动态数组):List插入删除高效(O(1))但随机访问慢(O(n));Vector随机访问快(O(1))但中间操作需移动元素。2. Deque(双端队列)结合链表和数组优点,支持高效头尾操作(O(1))和随机访问,但实现较复杂。3. STL容器分类:包括序列容器(vector/list等)、关联容器(set/map)、无序容器(unordered_set)和适配器(stack/queue)。4. Vector扩容原理:动态分配内存

qq_61574541的博客 964

Windows环境下ABAQUS、Fortran 编译器及Visual Studio的安装和关联

点击Continue,在随后的弹窗中勾选accept,并点击Customize(注意,在接下来的安装图片中,显示的版本号是2024.2,图片来自于一次失败的安装,懒得再截图了,步骤毫无区别,请见谅)。在下一步中,保持默认选项,之后软件会自动关联到刚才安装到visual studio,随后下一步进行安装(如果电脑中已经安装有其他版本的visual studio,则只保留2022)。在随后的弹窗中,根据指示找到。以防万一,尽量暂时退出所有杀毒软件,关闭防火墙,一般不会有影响,为确保万无一失,可以执行此步。

samurai12的博客 9962

SpringBoot文件上传实战:MultipartFile重复读取的3种方法(附避坑指南)

本文详细介绍了SpringBoot中处理MultipartFile重复读取的3种实用方法,包括字节数组缓存法、临时文件法和流重置法,并提供了避坑指南和性能优化技巧。特别适合需要多次读取上传文件内容的开发者,帮助解决InputStream流只能读取一次的问题。

weixin_28710999的博客 398

【小陈背八股-C++】Day04-大厂面试直击:Vector扩容机制,你真的懂STL容器吗?

🔥 面试必问:为什么vector扩容1.5倍而非2倍?emplace_back比push_back快在哪? 🔍 深度剖析:连续存储的vector如何保证性能?map红黑树为何比unordered_map更稳定? ⚡ 性能陷阱:动态数组与固定数组的使用禁区!不同场景下容器选择的黄金法则。 💡 实战技巧:从底层实现看懂容器行为,避免常见性能坑点,让你的C++代码效率提升一个量级! 🎯 无论你是面试突击还是性能优化,这篇指南将彻底改变你对STL容器的认知!

小陈为梦想而生 893

Simulink机电仿真避坑指南:如何用MATLAB解决液压系统建模的3大典型问题

本文针对液压系统建模在Simulink动态仿真中常见的三大难题——参数物理意义缺失、模型收敛性差及性能优化瓶颈,提供了专业的MATLAB解决方案。文章详细阐述了如何从物理参数推导仿真模型、破解代数环与刚性系统问题,并分享了模型降阶与加速技巧,旨在帮助工程师构建精确高效的机电系统仿真模型。

o9p0q1的博客 295

C++——STL

STL相关八股文,整理不易!欢迎一键三连!本文参考了很多材料bibi上的千峰提供的文档以及小程序面试鸭里头的文档!

qq_42615475的博客 880

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4812

(一)Tushare Pro教程:股票基本数据接口

 一直使用tushare作数据源,这里开个教程大家一起学习。 一、介绍        tushare是一个python股票数据源,现已升级到tushare pro版本,新版本在数据稳定性和获取速率上大幅提升。与wind、东财等收费数据源相比,tushare pro算是金融数据界的良心之作,其为从事金融工程、量化研究等方向的同学们提供了便利。tushare pro还有一点突出的特色就是已经将股票...

虎毛的博客 4万+

从零实现C++ STL队列:深入理解容器适配器与底层数据结构

队列是一种遵循先进先出(FIFO)原则的线性数据结构,广泛应用于任务调度、消息缓冲和广度优先搜索等场景。其核心原理在于对数据访问顺序的严格限制,仅允许在队尾插入、队头删除。在C++标准模板库(STL)中,`std::queue`并非独立的容器,而是一个**容器适配器**,它通过封装底层容器(如`deque`或`list`)的特定接口来提供队列行为,体现了代码复用和接口简化的设计哲学。这种适配器模式的价值在于分离了抽象接口与具体实现,允许开发者根据性能需求灵活选择底层数据结构。例如,默认使用`deque`因其

weixin_33326218的博客 338

2025华为OD机试真题+全流程解析+备考攻略+面试技巧+机考经验分享+Java/python/JS/C++/C语言实现

本专栏包含华为 OD 机试最新的 A卷+B卷+C卷+D卷+E卷题库,为全网最全、最新题库,500+真题。每一篇文章都包含了题目描述、解题思路以及实现代码。同时免费提供最新的在线OJ 刷题系统。已有上百名小伙伴通过刷真题题库通过了华为od机考,拒绝一切形式的代考,替考行为!!!以下是本专栏详细内容介绍:本专栏提供在线OJ刷题系统:OJ题库OJ系统注册&使用教程:OJ使用教程其他专栏以及答疑介绍:50+ 高频面试手撕真题,已有上百位小伙伴高频认证。1:机试没过,半年的冷冻期。2:已经订阅过我专栏的同学,推荐新人

MISAYAONE的博客 2225

八股文面试攻略一:C/C++

浅拷贝:拷贝指针,不拷贝指向的内容。共享同一块堆内存深拷贝:开辟一个新内存,将内存放进去。防止数据污染默认构造函数使用浅拷贝零拷贝:在网络传输、文件 IO 中,避免在用户态/内核态之间重复复制数据,通过共享内存、DMA、映射技术直接传输数据。减少数据在内核与用户态之间的复制,提升网络传输与大型文件处理性能。

qq_45793285的博客 905

FPGA JTAG接口设计全解析

JTAG是FPGA开发的核心接口,主要用于代码下载和在线调试。14-pin设计中包含TCK、TMS、TDI、TDO四个关键信号,采用信号-地布局增强抗干扰能力,TCK建议串联电阻。10-pin设计需注意转接适配,并推荐使用RCLAMP0524P等低电容TVS二极管进行ESD防护。两种接口设计都强调信号完整性和可靠性,建议PCB布局时保持JTAG走线短且预留调整空间。

在读研究生,FPGA电路设计与功能开发。 2184

解锁RK3588多屏异显:MIPI+HDMI+EDP混合输出全攻略

本文详细介绍了RK3588处理器在MIPI+HDMI+EDP混合输出配置中的技术实现与应用。作为一款高性能处理器,RK3588凭借其强大的图形处理能力,支持多屏异显功能,可满足智能安防、工业控制等领域的多屏显示需求。文章从硬件连接、设备树配置、内核驱动设置到显示参数调整,系统阐述了配置流程,并针对信号不稳定、显示模式不匹配等常见问题提供了解决方案。通过智能安防监控案例,展示了该技术在提高监控效率方面的实际应用价值。随着技术进步,RK3588多屏异显技术将在更多领域发挥重要作用,为开发者提供灵活多样的显示方案

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2433
上一篇: C++ STL 之 chrono 时间库详解
下一篇: C++ STL 之 string_view 详解
Ricky_Theseus
博客等级 码龄3年 126粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值