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

详细介绍:boost::circular_buffer的使用方法简介

boost::circular_buffer:

boost::circular_buffer 是 Boost 库中的一个循环缓冲区容器,特别适用于需要固定容量存储的场景。当缓冲区容量满时,新插入的元素会覆盖最旧或最新的元素(取决于插入方式)。以下是详细的使用方法和示例代码:

1. 基本使用方法

包含头文件
#include
‌‌创建循环缓冲区
boost::circular_buffer cb(3); // 创建容量为3的循环缓冲区
boost::circular_buffer cb2(cb); // 拷贝构造
boost::circular_buffer cb3(std::move(cb)); // 移动构造
‌‌初始化方法
  • 直接指定容量

    在构造 boost::circular_buffer 时,直接传入容量参数:

    #include
    #include
    int main() {
    // 初始化容量为5的循环缓冲区
    boost::circular_buffer cb(5);
    // 验证容量
    std::cout << "Capacity: " << cb.capacity() << std::endl; // 输出: Capacity: 5
    std::cout << "Size: " << cb.size() << std::endl;         // 输出: Size: 0 (初始为空)
    return 0;
    }
  • 初始化时填充默认值

    如果需要初始化时填充默认值,可以结合 std::generate 或循环:

    #include
    #include  // for std::generate
    #include
    int main() {
    const int capacity = 5;
    boost::circular_buffer cb(capacity);
    // 填充默认值0(实际无需显式填充,因为默认构造已初始化)
    std::generate(cb.begin(), cb.end(), []() { return 0; });
    // 或者直接通过循环插入
    for (int i = 0; i < capacity; ++i) {
    cb.push_back(0); // 显式插入0
    }
    // 验证
    for (const auto& elem : cb) {
    std::cout << elem << " "; // 输出: 0 0 0 0 0
    }
    return 0;
    }
  • 空间优化版本(circular_buffer_space_optimized

    如果需要动态调整容量以避免内存浪费,可以使用 boost::circular_buffer_space_optimized

    #include
    #include
    int main() {
    // 初始最小容量为2,最大容量为10
    boost::circular_buffer_space_optimized cb(2, 10);
    // 插入元素,容量会自动扩展
    for (int i = 0; i < 15; ++i) {
    cb.push_back(i);
    std::cout << "Current capacity: " << cb.capacity() << std::endl;
    }
    // 输出会显示容量从2逐步扩展到10
    return 0;
    }
  •  动态调整容量

    如果需要后续调整容量,可以使用 set_capacity 或 resize

    #include
    #include
    int main() {
    boost::circular_buffer cb(3); // 初始容量3
    cb.push_back(1);
    cb.push_back(2);
    // 动态调整容量为5
    cb.set_capacity(5);
    std::cout << "New capacity: " << cb.capacity() << std::endl; // 输出: 5
    // 继续插入元素(不会覆盖,因为容量扩大)
    cb.push_back(3);
    cb.push_back(4);
    cb.push_back(5);
    // 验证
    for (const auto& elem : cb) {
    std::cout << elem << " "; // 输出: 1 2 3 4 5
    }
    return 0;
    }
插入元素
  • push_back‌:在尾部插入元素,若缓冲区满,则覆盖最旧的元素(头部)。
  • push_front‌:在头部插入元素,若缓冲区满,则覆盖最新的元素(尾部)。
    cb.push_back(1); // 插入1
    cb.push_back(2); // 插入2
    cb.push_back(3); // 插入3,此时缓冲区满
    cb.push_back(4); // 覆盖1,缓冲区变为[2, 3, 4]
    cb.push_front(5); // 覆盖4,缓冲区变为[5,2,3]
  • insert‌:在指定位置插入元素。
    auto it = cb.begin() + 1;
    cb.insert(it, 6); // 在第二个位置插入6,缓冲区变为[5,6,2]

访问和遍历元素
  • 通过下标访问‌:
    assert(cb[0] == 2); // 访问第一个元素
    assert(cb.back() == 4); // 访问最后一个元素
  • 通过迭代器遍历‌:
    for (auto it = cb.begin(); it != cb.end(); ++it) {
    std::cout << *it << " "; // 输出:2 3 4
    }
  • 范围循环(推荐)‌:
    for (const auto& elem : cb) {
    std::cout << elem << " "; // 输出:2 3 4
    }
移除元素
  • pop_front‌:移除最旧的元素(头部)。
  • pop_back‌:移除最新的元素(尾部)。
    cb.pop_front(); // 移除2,缓冲区变为[3, 4]
    cb.pop_back();  // 移除4,缓冲区变为[3]
  • erase‌:移除指定位置的元素。
    auto it = cb.begin();
    cb.erase(it); // 移除第一个元素,缓冲区变为空
  • clear:容量不变,仅清空元素。
    cb.clear()

2. 高级特性函数

容量与状态检查
  • size‌:返回当前元素数量。
    assert(cb.size() == 3); // 当前元素数量
  • capacity‌:返回缓冲区总容量。
    assert(cb.capacity() == 3); // 总容量
  • empty‌:检查缓冲区是否为空。
    if (cb.empty()) { /* 处理空缓冲区 */ }
  • full‌:检查缓冲区是否已满。
    if (cb.full()) { /* 处理满缓冲区 */ }
  • 旋转缓冲区(rotate‌将缓冲区元素旋转指定位置。
    cb.rotate(cb.begin() + 1); // 将第二个元素旋转到头部
    // 缓冲区从[5,6,2]变为[6,2,5]

‌3. 完整示例代码

#include
#include
#include
int main() {
// 创建容量为3的循环缓冲区
boost::circular_buffer cb(3);
// 插入元素
cb.push_back(1);
cb.push_back(2);
cb.push_back(3);
// 断言检查
assert(cb[0] == 1);
assert(cb[1] == 2);
assert(cb[2] == 3);
assert(cb.size() == 3);
assert(cb.capacity() == 3);
// 插入新元素(覆盖旧元素)
cb.push_back(4); // 覆盖1,缓冲区变为[2, 3, 4]
assert(cb[0] == 2);
assert(cb[1] == 3);
assert(cb[2] == 4);
// 遍历缓冲区
std::cout << "Buffer contents: ";
for (const auto& elem : cb) {
std::cout << elem << " "; // 输出:2 3 4
}
std::cout << std::endl;
// 移除元素
cb.pop_front(); // 移除2,缓冲区变为[3, 4]
cb.pop_back();  // 移除4,缓冲区变为[3]
// 最终状态
assert(cb.size() == 1);
assert(cb[0] == 3);
return 0;
}
#include
#include
#include
int main() {
// 创建容量为3的循环缓冲区
boost::circular_buffer cb(3);
// 插入元素
cb.push_back(1);
cb.push_back(2);
cb.push_back(3);
assert(cb.full()); // 缓冲区已满
// 覆盖插入
cb.push_back(4); // 覆盖1,缓冲区变为[2,3,4]
cb.push_front(5); // 覆盖4,缓冲区变为[5,2,3]
// 遍历缓冲区
std::cout << "Buffer contents: ";
for (const auto& elem : cb) {
std::cout << elem << " "; // 输出:5 2 3
}
std::cout << std::endl;
// 线性化访问
int* p = cb.linearize();
assert(p[0] == 5 && p[1] == 2 && p[2] == 3);
// 旋转缓冲区
cb.rotate(cb.begin() + 1); // 缓冲区变为[2,3,5]
for (const auto& elem : cb) {
std::cout << elem << " "; // 输出:2 3 5
}
return 0;
}

‌4. 关键特性

  1. 固定容量‌:与 std::vector 或 std::list 不同,boost::circular_buffer 的容量在创建时固定,不会动态增长。
  2. 覆盖策略‌:当缓冲区满时,push_back 覆盖头部元素,push_front 覆盖尾部元素。
  3. 高效操作‌:插入和删除操作的时间复杂度为 O(1)。
  4. 线程安全‌:若需在多线程环境中使用,需配合互斥锁(如 std::mutex)。
  5. 构造函数初始化‌:boost::circular_buffer<int> cb(N) 直接指定容量 N
  6. 动态调整‌:使用 set_capacity(N) 或 resize(N, default_value)
  7. 空间优化‌:circular_buffer_space_optimized 适合需要动态容量的场景。
  8. 默认值‌:Boost 不会自动填充默认值,需手动初始化(如通过 std::generate)。

http://www.wxhsa.cn/company.asp?id=3559

相关文章:

  • 基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
  • PDD9.14 笔试 - 浪矢
  • 增肌,减脂,变瘦的联系和区别
  • (eval):1: _python-argcomplete: function definition file not found
  • 详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.
  • Nordic Neuton.AI 技术优势;
  • channel Sounding 工作流程
  • 基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
  • channel Sounding RTT和PBR 属性总结
  • 二分查找方法
  • 复制一个数组的方法
  • 判断目标是否在数组里面
  • 选择排序方法
  • ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程
  • 第一次作业
  • markdown文件上传到博客园教程
  • 【展厅多媒体】从技术到体验,AR在展厅中的一体化整合 - 指南
  • LilCTF 2025
  • AES算法原理与举例说明
  • ffplay音频重采样 - 教程
  • devexpress gridcontrol表格知识
  • 深入解析:Qt串口通信学习
  • 字符串算法笔记
  • 【光照】Unity[经验模型]和[物理模型]
  • 实用指南:浅聊一下Redisson分布式锁
  • JavaScript起源
  • 9.14做题随记
  • 树-学习笔记
  • centos 安装 postgresql 数据库
  • 个人问题反省--致命问题(急需解决)