【c++】【STL】std::vector

数据结构:STL:vector 定义容器和定义变量没什么区别vector<类型名> 变量名;类型可以是int、double、char、struct,也可以是STL容器:vector、set、queue等等。vector数组是一个一维数组,如果定义成vector数组的数组,那就是二维数组。//二维变长数组。 阅读详情

std::vector 是 C++ 标准库(<vector> 头文件)中最核心的动态数组容器,封装了可自动扩容的连续内存空间,兼具数组的随机访问效率和动态扩容的灵活性,是日常开发中使用频率最高的容器。以下从核心特性、内存模型、基础用法、高级操作、实现细节、性能优化、避坑要点七个维度,全面讲解 vector 的所有关键知识点。

一、核心特性(与原生数组的对比)

vector 本质是动态连续数组,核心优势是 “动态扩容 + 随机访问”,对比原生数组(T[])的核心差异如下:

特性std::vector原生数组(T [])
内存管理自动扩容 / 释放,无需手动管理固定长度,扩容需手动 new/delete
随机访问O (1) 效率(同数组),支持 []/at()O (1) 效率,仅支持 []
长度灵活性动态增删元素,size() 可动态变化长度固定,无法直接增删
越界检查at() 抛 out_of_range 异常无检查,越界为未定义行为(UB)
功能丰富度内置插入、删除、排序、遍历等方法需依赖 <algorithm> 手动实现
内存连续性元素存储在连续内存(同数组)连续内存

核心头文件与命名空间

#include <vector>   // 核心头文件
#include <algorithm> // 排序、查找等算法(可选)
using namespace std; // 否则需写 std::vector

二、内存模型(底层实现核心)

vector 的底层是连续的内存块,通过三个核心指针 / 成员管理内存(简化版实现):

template <class T>
class vector {
private:
    T* start_;       // 指向数组起始位置(第一个元素)
    T* finish_;      // 指向数组末尾的下一个位置(已用空间的末尾)
    T* end_of_storage_; // 指向内存块末尾的下一个位置(总容量的末尾)
};
  • size():已用元素个数 = finish_ - start_;
  • capacity():总容量 = end_of_storage_ - start_;
  • 内存布局:[start_, finish_) 是已用空间,[finish_, end_of_storage_) 是空闲空间。

1. 扩容机制(核心)

当 push_back()/insert() 等操作导致 size() == capacity() 时,vector 会自动扩容,核心步骤:

  1. 分配新内存:新容量通常为原容量的 2 倍(部分编译器为 1.5 倍,如 GCC);
  2. 拷贝 / 移动元素:将原内存中的元素拷贝(C++11 前)或移动(C++11 后)到新内存;
  3. 释放原内存:销毁原内存中的元素,释放原内存;
  4. 更新指针:start_/finish_/end_of_storage_ 指向新内存。
扩容示例(直观理解)
vector<int> v;
cout << v.size();     // 0
cout << v.capacity(); // 0(初始容量为0)

v.push_back(1);       // 容量不足,扩容到 1
cout << v.capacity(); // 1

v.push_back(2);       // 容量不足,扩容到 2
cout << v.capacity(); // 2

v.push_back(3);       // 容量不足,扩容到 4(2倍)
cout << v.capacity(); // 4

v.push_back(4);       // 容量足够,不扩容
cout << v.capacity(); // 4

v.push_back(5);       // 容量不足,扩容到 8(2倍)
cout << v.capacity(); // 8

2. 预分配容量(reserve)

频繁扩容会导致 “内存重新分配 + 元素拷贝”,性能损耗大,可通过 reserve(n) 提前预分配容量:

vector<int> v;
v.reserve(100); // 预分配 100 个元素的容量,size() 仍为 0
cout << v.size();     // 0
cout << v.capacity(); // 100

// 后续添加 100 个元素不会触发扩容
for (int i = 0; i < 100; ++i) {
    v.push_back(i); // 无扩容,性能最优
}

3. 收缩容量(shrink_to_fit)

C++11 引入 shrink_to_fit(),将容量缩减至与实际大小一致(释放空闲内存),但这是 “请求” 而非 “强制”(编译器可忽略):

vector<int> v;
v.reserve(100);
v.push_back(10);
cout << v.capacity(); // 100

v.shrink_to_fit();
cout << v.capacity(); // 10(容量匹配 size())

三、基础用法(必掌握)

1. 构造与初始化

vector 提供多种构造方式,覆盖不同场景:

构造方式示例说明
默认构造vector<int> v;空 vector,size=0,capacity=0
指定大小构造vector<int> v(5);5 个元素,默认值为 0(int)
指定大小 + 初始值vector<int> v(5, 10);5 个元素,每个值为 10
拷贝构造vector<int> v2(v1);深拷贝 v1 的所有元素
移动构造vector<int> v2(std::move(v1));转移 v1 的资源,O (1) 开销
迭代器范围构造vector<int> v(v1.begin(), v1.end());从迭代器范围构造
列表初始化(C++11)vector<int> v = {1,2,3,4,5};直接初始化元素
示例:构造函数
// 基础构造
vector<int> v1;                // 空
vector<int> v2(3);             // [0,0,0]
vector<int> v3(3, 5);          // [5,5,5]
vector<int> v4(v3);            // [5,5,5]
vector<int> v5 = {1,2,3};      // [1,2,3]
vector<int> v6(v5.begin()+1, v5.end()); // [2,3]

// 移动构造(v5 变为空)
vector<int> v7 = std::move(v5);
cout << v5.empty(); // true
cout << v7.size();  // 3

2. 元素访问

提供 4 种访问方式,各有适用场景:

访问方式语法越界处理适用场景
下标运算符v[i]无检查(UB)性能优先,确认索引合法
at () 方法v.at(i)抛 out_of_range 异常安全性优先,索引可能越界
首元素v.front()空 vector 时 UB快速获取第一个元素
尾元素v.back()空 vector 时 UB快速获取最后一个元素
数据指针v.data()返回 T* 指向首元素兼容 C 接口(如 C 函数)
示例:元素访问
vector<int> v = {10,20,30,40};
cout << v[1];      // 20(无越界检查)
cout << v.at(2);   // 30(越界抛异常)
cout << v.front(); // 10
cout << v.back();  // 40

// 兼容 C 接口
int* ptr = v.data();
cout << ptr[3];    // 40

3. 元素添加

添加方式语法说明时间复杂度
push_backv.push_back(5);尾部添加元素平均 O (1)(扩容时 O (n))
emplace_backv.emplace_back(5);尾部直接构造元素(C++11)平均 O (1)(比 push_back 高效)
insertv.insert(pos, val)指定位置插入元素O (n)(后续元素需后移)
emplacev.emplace(pos, val)指定位置直接构造元素(C++11)O (n)(比 insert 高效)
关键区别:push_back vs emplace_back
  • push_back:先构造元素,再拷贝 / 移动到 vector 尾部;
  • emplace_back:直接在 vector 尾部的内存中构造元素,避免拷贝 / 移动,性能更优(尤其对大对象)。
示例:元素添加
vector<int> v = {1,2,3};

// 尾部添加
v.push_back(4);    // [1,2,3,4]
v.emplace_back(5); // [1,2,3,4,5]

// 指定位置插入
auto it = v.begin() + 2;
v.insert(it, 10);  // [1,2,10,3,4,5]
v.emplace(it, 20); // [1,2,20,10,3,4,5]

// 插入多个元素
v.insert(v.end(), {6,7,8}); // [1,2,20,10,3,4,5,6,7,8]

4. 元素删除

删除方式语法说明时间复杂度
pop_backv.pop_back();删除尾部元素O(1)
erasev.erase(pos);删除指定位置元素O (n)(后续元素需前移)
erase(范围)v.erase(beg, end);删除指定范围元素O(n)
clearv.clear();清空所有元素(size=0,capacity 不变)O (n)(销毁所有元素)
示例:元素删除
vector<int> v = {1,2,3,4,5,6};

v.pop_back();      // 删除尾部 → [1,2,3,4,5]
v.erase(v.begin()+2); // 删除索引2 → [1,2,4,5]
v.erase(v.begin()+1, v.begin()+3); // 删除索引1-2 → [1,5]
v.clear();         // 清空 → size=0,capacity 仍为原容量
cout << v.size();     // 0
cout << v.capacity(); // 6(未变)

5. 常用状态判断

方法功能示例
empty()判断是否为空(size=0)if (v.empty()) { ... }
size()返回元素个数cout << v.size();
capacity()返回总容量cout << v.capacity();
max_size()返回最大可容纳的元素个数(系统限制)cout << v.max_size();

四、高级操作(C++11+ 特性)

1. 移动语义(C++11)

vector 实现了移动构造和移动赋值,避免深拷贝,提升性能:

// 移动构造:v1 转移资源给 v2,v1 变为空
vector<int> v1 = {1,2,3};
vector<int> v2 = std::move(v1);

// 移动赋值
vector<int> v3;
v3 = std::move(v2);

2. 范围 for 循环(C++11)

vector<int> v = {1,2,3,4,5};
// 只读遍历
for (int num : v) {
    cout << num << " "; // 1 2 3 4 5
}

// 修改元素
for (int& num : v) {
    num *= 2; // 每个元素乘2 → [2,4,6,8,10]
}

3. 迭代器(遍历核心)

vector 支持随机访问迭代器(最灵活的迭代器类型),可进行算术运算(+/-/++/--):

迭代器类型语法说明
普通迭代器v.begin()/v.end()指向首元素 / 尾后位置,可修改元素
常量迭代器v.cbegin()/v.cend()只读,不可修改元素(C++11)
反向迭代器v.rbegin()/v.rend()反向遍历(从尾到首)
示例:迭代器遍历
vector<int> v = {1,2,3,4,5};

// 普通迭代器(修改元素)
for (auto it = v.begin(); it != v.end(); ++it) {
    *it += 10; // [11,12,13,14,15]
}

// 常量迭代器(只读)
for (auto it = v.cbegin(); it != v.cend(); ++it) {
    cout << *it << " "; // 11 12 13 14 15
}

// 反向迭代器
for (auto it = v.rbegin(); it != v.rend(); ++it) {
    cout << *it << " "; // 15 14 13 12 11
}

4. 算法结合(<algorithm>)

vector 是连续内存,完美适配 STL 算法,常用算法如下:

算法功能示例
sort排序(默认升序)sort(v.begin(), v.end());
reverse反转元素顺序reverse(v.begin(), v.end());
find查找元素(返回迭代器)auto it = find(v.begin(), v.end(), 5);
count统计元素出现次数int cnt = count(v.begin(), v.end(), 3);
remove移除指定元素(需配合 erase)v.erase(remove(v.begin(), v.end(), 2), v.end());
示例:算法使用
vector<int> v = {3,1,4,1,5,9,2,6};

// 排序(升序)
sort(v.begin(), v.end()); // [1,1,2,3,4,5,6,9]

// 反转
reverse(v.begin(), v.end()); // [9,6,5,4,3,2,1,1]

// 查找元素 5
auto it = find(v.begin(), v.end(), 5);
if (it != v.end()) {
    cout << "找到 5,索引:" << it - v.begin() << endl; // 索引 2
}

// 移除所有 1(remove+erase 是标准用法)
v.erase(remove(v.begin(), v.end(), 1), v.end()); // [9,6,5,4,3,2]

5. swap(交换两个 vector)

swap 交换两个 vector 的内部指针(start_/finish_/end_of_storage_),时间复杂度 O (1),无元素拷贝:

vector<int> v1 = {1,2,3};
vector<int> v2 = {4,5,6};
v1.swap(v2); // v1=[4,5,6], v2=[1,2,3]

五、实现细节(深入理解)

1. 内存分配器(Allocator)

vector 依赖 STL 分配器(默认 std::allocator<T>)管理内存,分配器负责 allocate()(分配内存)和 deallocate()(释放内存)。可自定义分配器,但日常开发极少用到:

// 自定义分配器示例(简化版)
template <class T>
struct MyAllocator {
    using value_type = T;
    T* allocate(size_t n) {
        return static_cast<T*>(malloc(n * sizeof(T)));
    }
    void deallocate(T* p, size_t n) {
        free(p);
    }
};

// 使用自定义分配器
vector<int, MyAllocator<int>> v;

2. 元素的构造与析构

vector 严格区分 “内存分配” 和 “元素构造”:

  • reserve(n):仅分配内存,不构造元素(size() 不变);
  • resize(n):分配内存 + 构造 / 析构元素(size() 变为 n);
    • 若 n > size():新增元素用默认值 / 指定值构造;
    • 若 n < size():销毁多余元素。
示例:resize vs reserve
vector<int> v = {1,2,3};
v.reserve(5); // size=3,capacity=5(无元素构造)
v.resize(5);  // size=5,capacity=5(新增 2 个元素,值为 0)
v.resize(2);  // size=2,capacity=5(销毁最后 3 个元素)

3. 迭代器失效(核心坑点)

vector 的连续内存特性导致某些操作会使迭代器 / 指针 / 引用失效,核心规则如下:

操作迭代器失效情况
push_back()/emplace_back()扩容时所有迭代器失效;未扩容时仅尾后迭代器失效
insert()/emplace()插入位置后的迭代器失效;扩容时所有迭代器失效
erase()删除位置后的迭代器失效;尾后迭代器失效
resize()/reserve()扩容时所有迭代器失效;否则仅尾后迭代器失效
clear()所有迭代器失效(尾后迭代器除外)
swap()原迭代器指向交换后的元素(不失效,指向新位置)
示例:迭代器失效处理
vector<int> v = {1,2,3,4,5};
auto it = v.begin() + 2; // 指向 3

v.push_back(6); // 未扩容,it 仍有效
cout << *it;    // 3

v.reserve(10);  // 扩容,it 失效(野指针)
// cout << *it; // 未定义行为

// 正确做法:重新获取迭代器
it = v.begin() + 2;
cout << *it;    // 3

六、性能优化(实战技巧)

1. 提前 reserve 避免扩容

频繁 push_back() 小元素时,提前 reserve 可将时间复杂度从 O (n) 降至 O (1):

// 优化前:多次扩容
vector<int> v;
for (int i = 0; i < 1000000; ++i) {
    v.push_back(i); // 扩容约 20 次(2^0 → 2^19)
}

// 优化后:无扩容
vector<int> v;
v.reserve(1000000);
for (int i = 0; i < 1000000; ++i) {
    v.push_back(i); // 无扩容,性能提升显著
}

2. 优先使用 emplace_back 而非 push_back

emplace_back 直接在 vector 尾部构造元素,避免临时对象的拷贝 / 移动:

// 自定义大对象
struct BigObj {
    int a;
    string s;
    BigObj(int a_, string s_) : a(a_), s(s_) {}
};

vector<BigObj> v;
v.push_back(BigObj(1, "hello")); // 构造临时对象 → 移动/拷贝到尾部
v.emplace_back(2, "world");     // 直接在尾部构造,无临时对象

3. 批量插入 / 删除

避免循环中单次 insert()/erase()(每次 O (n)),优先批量操作:

// 优化前:循环 insert,O(n²) 复杂度
vector<int> v;
for (int i = 0; i < 1000; ++i) {
    v.insert(v.begin(), i); // 每次插入都要移动所有元素
}

// 优化后:先构造临时 vector,再拼接,O(n) 复杂度
vector<int> temp;
temp.reserve(1000);
for (int i = 0; i < 1000; ++i) {
    temp.push_back(i);
}
v.insert(v.begin(), temp.rbegin(), temp.rend()); // 批量插入

4. 避免频繁 shrink_to_fit

shrink_to_fit() 会触发内存重新分配,频繁调用反而降低性能,仅在确定不再扩容时使用。

七、避坑要点(高频错误)

1. 越界访问

  • v[i] 越界是未定义行为(可能崩溃、篡改内存);
  • 优先用 v.at(i)(抛异常),或先检查 i < v.size():
    vector<int> v = {1,2,3};
    // 错误:越界
    cout << v[5]; // UB
    // 正确:检查边界
    if (5 < v.size()) {
        cout << v[5];
    } else {
        cout << "索引越界";
    }
    

2. 迭代器失效后使用

迭代器失效后继续解引用,会导致未定义行为,核心解决方法:

  • 插入 / 删除后重新获取迭代器;
  • 利用 erase() 的返回值(指向删除位置的下一个迭代器):
    vector<int> v = {1,2,3,4,5};
    auto it = v.begin();
    while (it != v.end()) {
        if (*it % 2 == 0) {
            it = v.erase(it); // erase 返回下一个有效迭代器
        } else {
            ++it;
        }
    }
    

3. 混淆 size () 和 capacity ()

  • size() 是 “已用元素个数”,capacity() 是 “总容量”;
  • 遍历只能用 size(),不能用 capacity():
    vector<int> v;
    v.reserve(5);
    // 错误:capacity=5,但 size=0,循环不会执行
    for (int i = 0; i < v.capacity(); ++i) {
        v[i] = i; // UB(越界)
    }
    

4. 空 vector 访问 front ()/back ()

空 vector 调用 front()/back() 是未定义行为,需先检查 empty():

vector<int> v;
// 错误:空 vector
// cout << v.front();
// 正确:先检查
if (!v.empty()) {
    cout << v.front();
}

5. 拷贝大 vector 导致性能问题

大 vector 拷贝(如 vector<int> v2 = v1)会深拷贝所有元素,耗时严重,优先用移动语义(std::move)或引用:

vector<int> v1(1000000, 1);
// 错误:深拷贝,耗时
vector<int> v2 = v1;
// 正确:移动,O(1)
vector<int> v3 = std::move(v1);
// 或用引用
vector<int>& v4 = v1;

八、核心总结(必记知识点)

  1. 核心本质:动态连续数组,兼具数组的随机访问效率和动态扩容的灵活性;
  2. 核心概念:
    • size():已用元素个数,capacity():总容量;
    • reserve(n):预分配容量(不构造元素),resize(n):调整大小(构造 / 析构元素);
    • 扩容规则:默认 2 倍扩容,扩容时元素拷贝 / 移动,迭代器失效;
  3. 关键操作:
    • 添加:push_back()(拷贝)/emplace_back()(直接构造);
    • 删除:pop_back()(尾部)/erase()(指定位置);
    • 遍历:迭代器、范围 for、[];
  4. 性能优化:提前 reserve 避免扩容,优先 emplace_back,批量操作;
  5. 避坑重点:
    • 迭代器失效后禁止使用,erase() 需接收返回值;
    • 区分 size() 和 capacity(),避免越界访问;
    • 大 vector 优先用移动语义,避免深拷贝。

vector是面试中经常被问到的,除了能回答出基本的用法以及底层,最好要对底层的内存分配器有深入了解。

【C++基础】std::vector详解 是 C++ 标准库中的一个容器,提供了动态数组的功能。它的底层实现通常是使用连续的内存块来存储元素,因此可以通过指针算术来访问元素,并且支持常数时间的随机访问,并支持在容器末尾高效地添加和删除元素。 阅读详情

相关推荐

【C++STL基础入门】vector向量基础使用

C++STL(Standard Template Library)是C++标准库中的一部分,提供了一组通用的模板容器和算法,以及一些有用的功能。其中,vector是STL中最重要且常用的容器之一。它类似于数组,但提供了更多的功能和灵活性。本文将详细介绍vector的基本使用方法,帮助读者快速入门。这行代码的含义是在C++中定义了一个名为vec的变量,它的类型是vector,也就是一个整数向量。vector:这是一个模板类,用来表示存储整数的向量。

m0_62599305的博客 2435

容器库——std::vector

容器库——std::vector详解

qq_44778120的博客 1万+

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 952

C++ 中的 std::vector:动态数组操作和常用函数解析

C++ 中的 std::vector 是一个非常实用的容器,它提供了动态大小的数组功能,可以存储任意类型的元素,并且可以方便地进行元素的添加、删除和查询操作。本博客不仅介绍了一些常用的成员函数和操作符,如 push_back()、pop_back()、size()、empty() 和 clear(),还详细对比了 push_back() 和 emplace_back() 之间的区别。此外,博客还提供了一些小示例程序,以帮助读者更好地理解这些概念。

南城小馆 6972

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1456

C++ STL(一)std::vector std::array

需要传入一个已经存在的对象(或对象的副本),会调用该对象的拷贝构造函数(或移动构造函数)。接受构造对象所需的参数并在 vector内部直接构造对象,避免了不必要的拷贝或移动。重新指定容器的长度为num,若容器变长,则以默认值填充新位置。:通常会分配比当前容量大一倍的新内存,以减少频繁的内存分配和拷贝操作。返回指定位置 pos 处的元素的引用,并进行边界检查。返回指定位置 pos 处的元素的引用,不进行边界检查。:将原有元素从旧的内存位置拷贝到新的内存位置。:更新指向新内存的指针,并设置新的容量。

dingyahui的博客 1221

zemax光线光扇图

通过入瞳某一坐标(PX,PY)的光线在像面上有唯一的位置(EX,EY),以EX,EY为纵坐标,以PX,PY为横坐标,分别建立坐标系,把通过入瞳的光线都在坐标系里描点就得到了光扇图。对于视场内任意一点,取其子午面内的光线,以光线在光阑面上的透射点坐标为横坐标,同时以该光线在像面上的坐标为纵坐标,描出所有点,构成的图形即为子午面光扇图。在焦点位置,曲线的斜率为0,也就是说,不管入射时的横坐标(光阑面上的位置)是多少,离轴多远,都将汇聚在焦点处。此时,子午面和弧矢面有不同的分布,两条曲线不重合。

fendoudecheng的博客 8098

C++ STL std::vector 底层实现

【代码】C++ STL std::vector 底层实现。

zjkyeah的博客 669

从波士顿动力SpotMini拆解看四足机器人机械设计:关节布局与电机选型的5个关键决策点

本文深入解析波士顿动力SpotMini四足机器人的机械设计,聚焦关节布局与电机选型的5个关键决策点。通过拆解髋关节偏移距、膝关节传动链、电机热管理等核心设计,揭示商业级四足机器人的工程智慧,为工业巡检、物流机器人等应用提供实用参考。

postgres8guard的博客 893

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1098

【C++ | STL】std::vector 复制的几个方法总结

介绍c++的 std::vector 复制到另一个 vector 的几种方法,以及举例说明

wkd_007的博客 1946

保姆级教程:用Ansible 2.9自动化配置华为ENSP路由器(附Cloud连接避坑指南)

本文提供了一份详细的Ansible 2.9与华为ENSP路由器自动化配置教程,涵盖环境搭建、网络连通性配置、Playbook开发及典型问题排查。特别针对Cloud连接常见问题提供避坑指南,帮助运维工程师快速掌握网络自动化技能,提升工作效率。

weixin_42561476的博客 376

【C++ | STL】std::vector<T> 详细介绍以及例子代码(很全很详细)

本文总结了 C++ 语言stl 库的 std::vector 的一些常见用法,并举例介绍了各个成员函数的用法。

wkd_007的博客 1981

LeRobot 入门教程(五)异步推理

本文介绍了基于SmolVLA的异步推理技术在机器人控制中的应用。通过将动作预测与执行解耦,异步推理消除了传统同步推理中的等待延迟,使机器人行为更加流畅。文章详细讲解了如何安装依赖、启动策略服务器和机器人客户端,并重点说明了关键参数actions_per_chunk和chunk_size_threshold的调整方法。实验表明,异步推理能显著提升机器人响应速度,特别适合大规模模型应用。最后,文章建议用户根据具体硬件和任务需求优化参数配置,以获得最佳性能。

2506_90492529的博客 1644

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++ STL】std::vector

std::vector容器介绍

AmiaYukiAchami的博客 362

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ 第四阶段 STL 容器 - 第一讲:详解 std::vector

std::vector是C++ STL中最常用的动态数组容器,具有连续存储、自动扩容和高效随机访问等特性。本文详解其核心功能:1)多种构造方式;2)元素访问方法;3)容量管理操作;4)插入删除操作。重点分析性能优化策略,包括预分配内存、使用emplace_back提升插入效率。同时指出常见陷阱如迭代器失效问题,并提供典型应用场景示例,如动态数组模拟、STL算法实现和二维数组构建。通过合理使用vector既能获得数组的随机访问优势,又能享受动态扩容的便利。

弘羽 3552

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ STL源码剖析 5-std::vector

在C++标准模板库(STL)中,是一个序列容器,它封装了动态大小数组的接口,提供了随机访问能力,以及在数组尾部高效地插入和删除元素的能力。以下是public:// 类型定义// 迭代器类型// 构造函数和析构函数// 析构函数~vector();// 赋值运算符// 迭代器// 容量// 修改器// 数据访问// 填充和复制// 容量和内存。

wesigj的博客 1458

【c++】【stl】std::allocator(vector 默认分配器)

内存池优化:频繁小内存分配(比如 vector 频繁扩容)时,内存池可减少new/delete的系统调用开销;对齐要求:某些硬件 / 算法要求内存按 16/32 字节对齐,仅保证基本对齐;调试 / 统计:自定义分配器可统计内存分配次数、大小,排查内存泄漏;共享内存:分配器可从共享内存区域分配内存,实现进程间数据共享。std::allocator 核心职责:分离 “内存分配 / 释放” 和 “元素构造 / 析构”,vector 的所有内存操作都通过它完成;核心接口:处理原始内存(底层。

2402_85646905的博客 750

【C++学习笔记】STL容器之std::vector和std::array的区别

std::vector和std::array都是C++ STL中的容器类模板,用于存储一组元素,使用过程中容易混淆,文章整理了两者的区别和使用方法与使用案例。

BTChioa的博客 1956

C++ 第四阶段 STL 容器 - 第七讲:详解 std::vector 与 std::deque —— 动态数组与双端队列的深度解析

vector 和 deque 是 C++ STL 中的两种顺序容器,各有特点:vector 采用连续内存布局,适合尾部频繁操作和随机访问;deque 采用分块存储,支持两端高效操作。vector 在中间插入/删除时效率较低且扩容开销大,而 deque 避免了频繁扩容但内存不连续。优化建议:vector 应预分配空间,deque 应优先两端操作。典型应用场景:vector 适用于动态数组和随机访问需求,deque 适合队列实现和内存敏感场景。

弘羽 933

C++ STL 核心容器:深入理解 std::vector

是一个动态数组(dynamic array),位于<vector>头文件中。它在堆上分配内存,支持自动扩容,并提供随机访问能力。// 声明一个空的整型 vector与原生数组相比,vector自动管理内存:无需手动new/delete动态大小:可随时push_backpop_back安全边界检查(通过.at()兼容 STL 算法:如sortfindfor_each等是 C++ 中最通用、最高效的动态数组实现。掌握其内存模型、扩容机制和性能特性,能帮助你写出更安全、更高效的代码。记住三句话。

2401_86355811的博客 336

C++ STL标准库:std::vector 使用详解

文章目录1. 简介2. 使用示例3. 构造、析构、赋值3.1 std::vector::vector 构造函数3.2 std::vector::~vector 析构函数3.3 std::vector::operator= “=”符号4. Iterators 迭代器4.1 std::vector::begin4.2 std::vector::end4.3 std::vector::rbegin4.4 std::vector::rend4.5 std::vector::cbegin (C++11)4.6 std

超级大洋葱的博客 8万+

c++面试题,请使用STL的std::remove_if算法删除std::vector<int>容器中大于5的数字

**在C++ 中, std::remove_if 算法并不会真正从容器中删除元素, 而是将满足条件的元素移动到容器末尾,并返回一个指向新的逻辑结束位置的迭代器。 你需要使用容器的 erase 成员函数来真正删除这些元素。**

sunflower_2020的博客 401

C++ STL : std::vector

练习下C++ STL中std::map类的常用方法,方便以后查阅。 如有不正确的地方,请读者及时指正,欢迎转载,谢谢! #include #include //1) 容器通常都是类模板,在使用时需要传递模板参数来实例化容器类型。 //2) 容器内的所有元素都是拷贝,当需要存储自定义类或结构体的时候,容器内通常保存对象的指针。 //3) 可通过容器元素的指针,引用或迭代器来修改容器

zxh2075的专栏 590

「C/C++」C++ STL容器库 之 std::vector根据下标的批量删除

如果你想通过一个下标数组 来删除 中的元素,需要注意以下几点:以下是实现代码: 代码解释: 排序下标:删除元素:检查下标有效性:输出结果: 删除过程: 删除下标 : 变为 。 删除下标 : 变为 。 删除下标 : 变为 。 注意事项: 如果 中有重复的下标,可能会导致重复删除或未定义行为。可以在排序前对 去重。 如果 中的下标超出 的范围,需要额外处理(如忽略或报错)。 去重版本: 如果 中可能有重复的下标,可以在排序前去重: 何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)

何曾参静谧的博客 943
上一篇: 【c++】流(Stream)全解析:从 iostream 到输入输出核心
下一篇: 【c++】【stl】std::allocator(vector 默认分配器)
學602
博客等级 码龄2年 8粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值