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

<C++学习>C++ Boost 容器操作教程

C++ Boost 容器操作教程

Boost 提供了一系列增强 C++ 标准容器功能的库,涵盖了从简单数组到多索引容器的多种场景。相比 C++ 标准容器,Boost 容器具有更强的灵活性和性能。


1. Boost 容器的主要类型

  1. Boost.Array:提供固定大小的数组替代 std::array
  2. Boost.MultiArray:支持多维数组操作。
  3. Boost.Unordered:哈希表实现的容器,类似 std::unordered_mapstd::unordered_set
  4. Boost.MultiIndex:支持多种索引方式的数据容器。
  5. Boost.CircularBuffer:实现循环队列(固定大小缓冲区)。
  6. Boost.DynamicBitset:高效操作动态位集。

2. Boost.Array

boost::array 是固定大小数组的实现,类似于 std::array,但兼容 C++03。

示例:基本操作

#include <boost/array.hpp>
#include <iostream>

int main() {
    boost::array<int, 5> arr = {{1, 2, 3, 4, 5}}; // 初始化

    std::cout << "Array elements: ";
    for (auto elem : arr) {
        std::cout << elem << " ";
    }

    std::cout << "\nSize: " << arr.size() << std::endl;
    std::cout << "First element: " << arr.front() << std::endl;
    std::cout << "Last element: " << arr.back() << std::endl;

    return 0;
}

3. Boost.MultiArray

boost::multi_array 是一个多维数组容器,支持高效的多维数据存储和操作。

示例:二维数组

#include <boost/multi_array.hpp>
#include <iostream>

int main() {
    // 创建一个 3x4 的二维数组
    boost::multi_array<int, 2> array(boost::extents[3][4]);

    // 填充数据
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            array[i][j] = i * 4 + j;
        }
    }

    // 打印数组内容
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            std::cout << array[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

4. Boost.Unordered

boost::unordered_mapboost::unordered_set 是哈希表实现的无序容器,功能类似 std::unordered_mapstd::unordered_set

示例:boost::unordered_map

#include <boost/unordered_map.hpp>
#include <iostream>

int main() {
    boost::unordered_map<std::string, int> umap;

    // 插入数据
    umap["Alice"] = 25;
    umap["Bob"] = 30;

    // 遍历数据
    for (const auto& pair : umap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 查找数据
    if (umap.find("Alice") != umap.end()) {
        std::cout << "Alice's age: " << umap["Alice"] << std::endl;
    }

    return 0;
}

5. Boost.MultiIndex

boost::multi_index 是一个支持多种索引方式的容器,可以同时对数据按多种规则排序或查找。

示例:按多个规则索引

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <iostream>

struct Person {
    int id;
    std::string name;

    Person(int id, std::string name) : id(id), name(name) {}
};

// 定义命名空间缩写
namespace bmi = boost::multi_index;

// 定义容器类型
typedef bmi::multi_index_container<
    Person,
    bmi::indexed_by<
        bmi::ordered_unique<bmi::member<Person, int, &Person::id>>,       // 按 ID 索引
        bmi::ordered_non_unique<bmi::member<Person, std::string, &Person::name>> // 按名字索引
    >
> PersonContainer;

int main() {
    PersonContainer people;

    // 插入数据
    people.insert(Person(1, "Alice"));
    people.insert(Person(2, "Bob"));
    people.insert(Person(3, "Alice"));

    // 按 ID 遍历
    auto& id_index = people.get<0>();
    for (const auto& person : id_index) {
        std::cout << "ID: " << person.id << ", Name: " << person.name << std::endl;
    }

    // 按名字查找
    auto& name_index = people.get<1>();
    auto it = name_index.find("Alice");
    while (it != name_index.end() && it->name == "Alice") {
        std::cout << "Found Alice with ID: " << it->id << std::endl;
        ++it;
    }

    return 0;
}

6. Boost.CircularBuffer

boost::circular_buffer 是一个固定大小的循环缓冲区(环形队列),适用于 FIFO(先进先出)场景。

示例:基本操作

#include <boost/circular_buffer.hpp>
#include <iostream>

int main() {
    boost::circular_buffer<int> cb(3); // 大小为 3 的缓冲区

    // 插入元素
    cb.push_back(1);
    cb.push_back(2);
    cb.push_back(3);
    cb.push_back(4); // 超出容量,覆盖第一个元素

    // 遍历缓冲区
    for (int val : cb) {
        std::cout << val << " ";
    }

    return 0;
}
输出
2 3 4

7. Boost.DynamicBitset

boost::dynamic_bitset 是动态位集合,可以高效地存储和操作二进制数据。

示例:基本操作

#include <boost/dynamic_bitset.hpp>
#include <iostream>

int main() {
    boost::dynamic_bitset<> bits(10); // 创建 10 位的动态位集合

    bits[2] = 1;
    bits[5] = 1;

    std::cout << "Bitset: " << bits << std::endl;

    bits.flip(); // 取反操作
    std::cout << "Flipped: " << bits << std::endl;

    return 0;
}

8. 学习建议与实践

  1. 从基础开始

    • 熟悉 boost::arrayboost::unordered_map 的用法。
    • 学习 boost::circular_buffer 的循环缓冲区实现。
  2. 逐步深入

    • 研究 boost::multi_array 的多维数组操作。
    • 理解 boost::multi_index 容器的多索引机制。
  3. 参考文档与示例

    • Boost.Container 官方文档
    • Boost.MultiIndex 官方文档
原文地址:https://blog.csdn.net/a15236617777/article/details/145083338
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/502175.html

相关文章:

  • 使用Deepseek搭建类Cursor编辑器
  • [笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server
  • 网络安全、Web安全、渗透测试之笔经面经总结
  • 稀疏编码 (Sparse Coding) 算法详解与PyTorch实现
  • 计算机网络 网络层 2
  • 量子计算:从薛定谔的猫到你的生活
  • 秩为1的矩阵可以表示为两个向量的外积
  • MetaPhlAn2-增强版宏基因组分类谱工具-一条命令获得宏基因组物种组成
  • 不触碰资金的支付网关有哪些?
  • 图匹配算法(涵盖近似图匹配)
  • 云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换
  • 深入浅出MyBatis框架
  • 六年之约day13
  • 【解决】okhttp的java.lang.IllegalStateException: closed错误
  • 【Linux系统】—— vim 的使用
  • 第27章 汇编语言--- 设备驱动开发基础
  • 【Rust】结构体的方法语法
  • 单片机控制步进电机 A4988 Proteus仿真
  • 拷贝构造函数
  • Kutools for Excel 简体中文版 - 官方正版授权
  • Linux用户管理:普通用户的创建、删除、查看
  • 音频DSP的发展历史
  • 设计模式(4)——七大原则
  • LeetCode 2270.分割数组的方案数:前缀和
  • LeetCode 2270: 分割数组的方案数
  • Mac MySQL 8.0.30的安装(保姆级教程)