下标索引获取map值

实现原理

使用map与vector混合的方式实现map的下标索引获取值功能。需要注意的是模板传参中第二个参数的第一个对象做key值要保持数据格式一致,如果不理解这句话的涵义请查看add函数。

参考源码

#ifndef VECTOR_MAP__H_
#define VECTOR_MAP__H_

#include <map>
#include <vector>
#include <thread>
#include <mutex>
#include <iostream>

#ifndef LOGOUT
#define LOGOUT printf
#endif

template<class T1, class T2>
class VectorMap {
private:
	//数据存储容器
	std::map<T1, T2> mDataMap;
	std::vector<T2> mDataVector;
	//数据存储容器锁
	mutable std::mutex mDataMutex;

public:
	VectorMap() {}
	virtual ~VectorMap() {}

public:
	/*
	 * @brife 添加数据
	 * @param info 数据信息
	 * */
	virtual void add(const T2& info)
	{
		 std::lock_guard<std::mutex> lock(mDataMutex);
		//T2的开头放入一个T1型数据做key值
		const T1 key = *(T1*)&info;
		mDataMap[key] = info;

		//同步数据到vector便于通过索引值查找数据
		mDataVector.clear();
		for (auto it : mDataMap)
		{
			mDataVector.push_back(it.second);
		}
	}

	/*
	 * @brife 查找数据
	 * @param id 数据id
	 * @param info 出参数据信息
	 * @return true 查找成功;false 查找失败
	 * */
	const bool getById(const T1& id, T2& info) const
	{
		std::lock_guard<std::mutex> lock(mDataMutex);
		auto it = mDataMap.find(id);
		if (mDataMap.end() != it)
		{
			info = it.second;
			return true;
		}
		return false;
	}

	/*
	 * @brife 查找数据
	 * @param index 索引值
	 * @param info 出参数据信息
	 * @return true 查找成功;false 查找失败
	 * */
	const bool getByIndex(const uint32_t& index, T2& info) const
	{
		std::lock_guard<std::mutex> lock(mDataMutex);
		if (mDataVector.size() <= index)
		{
			LOGOUT("--%d-- --%s-- size:%u index:%u 索引越界!!!\n", __LINE__, __FILE__, mDataVector.size(), index);
			return false;
		}
		info = mDataVector[index];
		return true;
	}

	/*
	 * @brife 查找数据
	 * @param index 索引值
	 * @return 返回数据信息
	 * */
	const T2 operator[](uint32_t index) const
	{
		std::lock_guard<std::mutex> lock(mDataMutex);
		if (mDataVector.size() <= index)
		{
			LOGOUT("--%d-- --%s-- size:%u index:%u 索引越界!!!\n", __LINE__, __FILE__, mDataVector.size(), index);
			return T2();
		}
		return mDataVector[index];
	}

	/*
	 * @brife 删除数据
	 * */
	void clear(void)
	{
		std::lock_guard<std::mutex> lock(mDataMutex);
		mDataMap.clear();
		mDataVector.clear();
		LOGOUT("--%d-- --%s-- 清除容器数据\n", __LINE__, __FILE__);
	}

	/*
	 * @brife 获取数据长度
	 * @return 返回数据长度
	 * */
	const uint32_t size(void) const
	{
		std::lock_guard<std::mutex> lock(mDataMutex);
		return mDataVector.size();
	}
};

int main(void)
{
	VectorMap<int, int> mVectorMap;

	mVectorMap.add(10086);
	mVectorMap.add(10010);
	mVectorMap.add(10000);

	std::cout << "size:" << mVectorMap.size() << std::endl;
	for (uint32_t level1 = 0; level1 < mVectorMap.size(); ++level1)
	{
		std::cout << "index:" << level1 << "\tval:" << mVectorMap[level1] << std::endl;
	}

	return 0;
}

#endif /* VECTOR_MAP__H_ */

输出结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在multimap中,不支持下标运算符。这意味着你不能像在map中那样使用下标来访问元素。 相反,你可以使用迭代器来遍历multimap的元素,并使用成员函数find()来查找特定的键。你还可以使用equal_range()函数来查找与给定键相关联的所有元素的范围。 由于multimap允许重复的键,因此使用下标索引无法准确返回相同键的多个关联。如果你要查找与特定键相关联的所有,你需要使用迭代器来遍历multimap并找到所有与给定键相等的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL入门教程(7) multimap、multiset的使用](https://download.csdn.net/download/weixin_38731239/13989107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [map/ multimap容器(键对)](https://blog.csdn.net/weixin_62848630/article/details/125955119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [STL的multimap使用(一对多索引)](https://blog.csdn.net/elcoteq983/article/details/7000231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值