BOOST库学习之容器库(上)

前言

本次笔记记录如下知识点

  1. multi_index容器
  2. dynamic_bitset容器

一、multi_index容器

  • multi_index容器是一个多重索引的容器,它的底层结构是用来存放 结构体的 map 的数据结构,
    但不同于 stl,boost 中普通的map,它可以根据用户的需要来指定索引的类型,即 key 的值可以根据需要的不同而变化的。
  • multi_index结构如下所示:
//表结构
typedef struct student
{
	int st_id;
	string st_name;
	int st_age;
	string st_course;

	student(int id, string name, int age, string course)
	{
		this->st_id = id;
		this->st_name = name;
		this->st_course = course;
		this->st_age = age;
	}
}Stu;

//设置索引,相当于map容器的key
struct s_id{};
struct s_name{};
struct s_age{};


//定义一个多索引的容器
typedef multi_index_container
<
	//multi_index容器的表名
	student,
	//设置多维索引
	boost::multi_index::indexed_by
	<
		/*
		 *	ordered_unique表示唯一值的索引
		 *  ordered_non_unique表示非唯一的值
		 *	BOOST_MULTI_INDEX_MEMBER创建表中的元素结构体名称, 索引
		 *	的类型,索引的名称等于 tag<> 中设定的名称
		 */
		ordered_unique<tag<s_id>,BOOST_MULTI_INDEX_MEMBER(student, int, st_id)>,
		ordered_non_unique<tag<s_name>, BOOST_MULTI_INDEX_MEMBER(student, string, st_name)>,
		ordered_non_unique<tag<s_age>, BOOST_MULTI_INDEX_MEMBER(student, int, st_age)>
	>
>Stu_Table;
  • multi_index结构的操作如下:
int main(int argc, char* argv[])
{
	//插入数据
	Stu_Table sTable;
	sTable.insert(student(1, "aaa", 16, "qbb"));
	sTable.insert(student(2, "sss", 17, "bwwb"));
	sTable.insert(student(3, "adsa", 24, "beb"));
	sTable.insert(student(4, "adsa", 27, "rbb"));
	sTable.insert(student(5, "wee", 18, "beb"));
	sTable.insert(student(6, "qqq", 24, "wbb"));

	//以id为key值查询
	Stu_Table::index<s_id>::type& student_ID = sTable.get<s_id>();
	Stu_Table::index<s_id>::type::iterator iter_id = student_ID.begin();
	for (; iter_id != student_ID.end(); iter_id++) {
		cout << "学生信息:" << iter_id->st_id <<"," << iter_id->st_name <<"," ;
		cout << iter_id->st_age << "," << iter_id->st_course << endl;
	}
	cout << endl;

	//以name为key值查询
	Stu_Table::index<s_name>::type& student_Name = sTable.get<s_name>();
	Stu_Table::index<s_name>::type::iterator iter_Name = student_Name.begin();
	for (; iter_Name != student_Name.end(); iter_Name++) {
		cout << "学生信息:" << iter_Name->st_id << "," << iter_Name->st_name << ",";
		cout << iter_Name->st_age << "," << iter_Name->st_course << endl;
	}
	cout << endl;

	//以find函数查找
	Stu_Table::index<s_age>::type::iterator iter_Age = sTable.get<s_age>().find(24);
	if (iter_Age != sTable.get<s_age>().end())
	{
		cout << "学生信息:" << iter_Age->st_id << "," << iter_Age->st_name << ",";
		cout << iter_Age->st_age << "," << iter_Age->st_course << endl;
	}
	cout << endl;
	//修改
	Stu_Table::index<s_age>::type::iterator iter_Age2 = sTable.get<s_age>().find(18); // 查找wang
	if (iter_Age != sTable.get<s_age>().end())
	{
		
		cout << "学生信息:" << iter_Age2->st_id << "," << iter_Age2->st_name << ",";
		cout << iter_Age2->st_age << "," << iter_Age2->st_course << endl;

		student wang = *iter_Age2;
		wang.st_age = 1000;
		wang.st_id = 66;	 
		sTable.get<s_age>().replace(iter_Age2, wang);

		cout << "学生信息:" << iter_Age2->st_id << "," << iter_Age2->st_name << ",";
		cout << iter_Age2->st_age << "," << iter_Age2->st_course << endl;
	}

	return 0;
}

运行结果如下
在这里插入图片描述

二、dynamic_bitset容器

  • dynamic_bitset容器是用于存储二进制位的一个容器,存储空间可以进行动态的增长,也可以进行二进制位运算。
  • 容器的使用规则如下:
#include <iostream>
#include <boost/dynamic_bitset.hpp>
using namespace std;
using namespace boost;

int main()
{
	//1、创建容器对象
	dynamic_bitset<> db1;               //空的容器
	dynamic_bitset<> db2(10);		    //容器大小为10
	dynamic_bitset<> db3(0x16, 3);	    //容器大小为22,3会转换为二进制存储
	cout << db3 << endl;
	dynamic_bitset<> db4(db3);          //拷贝容器
	cout << db4 << endl;
	//2、容器的扩展
	dynamic_bitset<> db5;
	db5.resize(10, true);               //对容器进行扩展,并设置值为1
	cout << db5 << endl;
	//3、容器的运算
	dynamic_bitset<> db6;
	db6.resize(5, true);
	db6[0] &= 0;
	cout << db6[0] << endl;
	db6[1] ^= 0;
	cout << db6[1] << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值