boost multi_index_container 多索引容器

多索引容器 multi_index_container

为什么要使用multi_index_container

相信想必大家在实际开发中一定多少会遇到一些的问题,我需要创建一个可以索引的容器,例如map,set 但是无论map还是set 都是单索引的,例如建立一个类,类里有多个成员变量我们都要对应的索引便于查找 例如:

class Ticket
{
public:

	int ticketHeight;//块高
	uint256 ticketTxHash;//票hash
	CAmount ticketPrice;//当前票的票价
	CBitcoinAddress ticketAddress;//买票的地址


	Ticket();
	Ticket(const Ticket& ticket);
	Ticket(int ticketHeight, uint256 ticketTxHash, CAmount ticketPrice, CBitcoinAddress ticketAddress);
	void operator=(Ticket & ticket)
	{
		this->ticketAddress = ticket.ticketAddress;
		this->ticketHeight = ticket.ticketHeight;
		this->ticketPrice = ticket.ticketPrice;
		this->ticketTxHash = ticket.ticketTxHash;
	}
	bool operator==(Ticket ticket)
	{
		if (this->ticketAddress == ticket.ticketAddress &&
			this->ticketHeight == ticket.ticketHeight &&
			this->ticketTxHash == ticket.ticketTxHash &&
			this->ticketPrice == ticket.ticketPrice)
		{
			return true;
		}
		return false;
	}
	std::string toString();
	~Ticket();
private:

};

我需要对ticketHeight,ticketTxHash 经行排序索引,如果只是使用map,set构建索引的话,只能对应一种索引,ticketTxHash 或者ticketHeight,而我们需要使用两个map或者set才可以完成对应的需求,那么有没有一种结构可以对应两个排序索引——答案是有的 就是我们要说的 boost库中的 multi_index_container

下面就来说一下 multi_index_container 的基本使用,以及我遇到的坑,希望大家不要踩到;

创建

multi_index_container可以看作加载在内存中的数据库,不多说直接上代码

	struct ticket_tx_hash {};//为排序索引后表建立的表明()
	struct ticket_height {};


	typedef
		boost::multi_index_container<
		Ticket,	//此处为你要排序的成员类名
		indexed_by<	//indexed_by<...> 中填写索引规则
		ordered_unique< //ordered_unique 类比数据库中的主键为唯一索引,ordered默认升序,还有其他顺序下面会做具体描述
			//tag<...> 指定表名 需要声明即上面的结构体名
			//BOOST_MULTI_INDEX_MEMBER boost的宏,表示在目标中选取成员作为排序依据 
			//(Ticket, uint256, ticketTxHash) Ticket:容器成员  uint256:排序依据的类型  ticketTxHash :排序依据
			tag<ticket_tx_hash>, BOOST_MULTI_INDEX_MEMBER(Ticket, uint256, ticketTxHash)>,
		ordered_non_unique<//非唯一索引——可与存在多个
		tag<ticket_height>, BOOST_MULTI_INDEX_MEMBER(Ticket, int, ticketHeight)>
		>
		> ticketpool_set;
		
	ticketpool_set ticket_pool;

这样就完成了一个多索引容器类型ticketpool_set的建立,接着实例化了一个ticketpool_set类型的ticket_pool

补充1 :排序不止ordered_unique/ordered_non_unique一种,还有hashed_unique,下面是一段比特币mempool代码,以及指定排序规则

    typedef boost::multi_index_container<
        CTxMemPoolEntry,
        boost::multi_index::indexed_by<
            // hashed_unique 按照hash排序
            boost::multi_index::hashed_unique<mempoolentry_txid, SaltedTxidHasher>,
            //指定排序规则 CompareTxMemPoolEntryByDescendantScore
            boost::multi_index::ordered_non_unique<
                boost::multi_index::tag<descendant_score>,
                boost::multi_index::identity<CTxMemPoolEntry>,
                CompareTxMemPoolEntryByDescendantScore
            >,
            。。。。//省略

Boost库中的multi_index是一种强大的工具,它允许你在STL容器(如map、set等)中创建多个索引视图,每个索引对应于不同的排序标准或访问模式。以下是使用boost::multi_index的基本步骤: 1. **包含头文件**: 首先,你需要包含`<boost/multi_index_container.hpp>`和需要的单个或多索引的头文件。 ```cpp #include <boost/multi_index_container.hpp> #include <boost/multi_index/member.hpp> ``` 2. **声明multi_index_container**: 定义一个multi_index_container,指定存储的数据类型(例如std::string),以及你想要创建的索引类型。你可以选择primary_index作为默认索引,也可以添加secondary_indices。 ```cpp using index_type = boost::multi_index::ordered_set<std::string>; typedef boost::multi_index_container< std::pair<std::string, int>, // 存储的数据类型 boost::multi_index::indexed_by< boost::multi_index::primary_index<>, boost::multi_index::hashed_non_unique<index_type> > >; ``` 这里`hashed_non_unique`表示元素是唯一的,但是查找速度较快(因为使用哈希表)。 3. **创建实例**: 实例化multi_index_container,并为其分配内存。 ```cpp index_type my_index; ``` 4. **插入数据**: 使用insert函数将数据加入容器,并关联到适当的索引。 ```cpp my_index.insert({"key1", value1}); ``` 5. **通过索引访问数据**: 可以通过索引来检索数据,如primary_index用于快速查找,而index_type可以用于按照自定义键值进行搜索。 ```cpp // Primary index search auto it = my_index.begin(); for (; it != my_index.end(); ++it) { std::cout << "Primary Index: " << it->first << ", Value: " << it->second << '\n'; } // Indexed by search auto search_result = my_index.find("key1"); if (search_result != my_index.end()) { std::cout << "Hashed Search: " << search_result->first << ", Value: " << search_result->second << '\n'; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值