map存放函数指针

本文介绍了一种使用C++标准库中的map容器来实现函数注册与映射的方法。通过定义一个函数指针类型MyCalFun_ptr,该类型指向接受std::vector<int>参数并返回double类型的函数。然后创建了一个std::map<std::string, MyCalFun_ptr>类型的func_list,用于存储函数名称和对应的函数指针。以mymax函数为例,展示了如何将一个函数注册到func_list中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <map>
#include <vector>

typedef double (*MyCalFun_ptr)(const std::vector<int> &);
std::map<std::string,MyCalFun_ptr> func_list;  //存放自定义的函数名,及其功能实现函数
double mymax(const std::vector<int> &token_list)
{
	std::size_type token_size = token_list.size();
	maxnum = token_list[0];
	for(std::size_type i = 0 ; i < token_size ; ++i)
	{
		if(token_list[i] > max)
		{
			max = token_list[i]
		}
	}
	return max;
}
std::map<std::string,MyCalFun_ptr> func_list {{"MAX",mymax}}

### 关于 `std::map` 的 `reserve` 函数 在 C++ 中,标准库中的关联容器(如 `std::map` 和 `std::set`)并不提供类似于序列容器(如 `std::vector` 或 `std::string`)的 `reserve` 方法。这是因为这些关联容器的设计基于平衡二叉树结构(通常是红黑树),其内部存储机制不同于动态数组。 #### 原因分析 对于像 `std::vector` 这样的连续内存分配器来说,`reserve` 可以预先分配一定大小的空间来减少多次重新分配带来的性能开销。然而,`std::map` 是一种有序映射数据结构,它的节点是通过指针连接起来的,而不是存放在一块连续的内存区域中。因此,即使知道要插入多少元素,也无法提前分配固定数量的节点空间[^1]。 尽管如此,在某些特定场景下可以采取其他方式优化大量插入操作时的效率: - **批量插入**: 如果事先知道了所有的键值对,则可以通过先将它们放入一个临时向量再利用 `std::map::insert` 提供的范围版本一次性完成插入动作。 ```cpp #include <iostream> #include <vector> #include <map> int main(){ std::vector<std::pair<int, int>> data{{1, 2}, {3, 4}}; std::map<int, int> myMap; myMap.insert(data.begin(), data.end()); } ``` - **使用 unordered_map 替代**: 当不需要保持按键排序特性的时候,考虑采用哈希表形式即 `std::unordered_map`, 它支持类似矢量那样的预留容量功能(`rehash`)从而提高大批量随机访问模式下的写入速度. 需要注意的是虽然上述方法可能改善一些情况下的表现但他们并不能完全替代不存在的标准行为也就是所谓的"reserve". #### 析构函数的作用补充说明 另外值得注意的一点是在讨论任何类型的 STL 容器时候都不能忽略资源管理方面的话题比如当自定义类型作为 value 类型被保存到 map 中时确保该类具有适当定义好的析构函数以便自动清理不再使用的实例防止发生泄露问题正如前面提到过的那样[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值