前言
本次笔记记录如下知识点
- multi_index容器
- 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;
}