c++ - 与 std::map 类型匹配的模板函数
问题描述
我的程序中有四个地图:
std::map< int, SigGen* > id_to_siggen_map;
std::map< int, std::vector< double > > id_to_ticks_map;
std::map< int, std::vector< double > > id_to_samples_map;
std::map< int, QListWidgetItem* > id_to_item_map;
我想编写一个模板函数,给定一个id,可以从上述任何映射中删除与该id对应的条目,即
int id = 4; //could be any other id number
delete_from_map(id, id_to_siggen_map); //deletes entry corresponding to id 4 from id_to_siggen_map
delete_from_map(id, id_to_ticks_map); //deletes corresponding entry from id_to_siggen_map
delete_from_map(id, id_to_samples_map);
delete_from_map(id, id_to_item_map);
到目前为止我所拥有的:
template <typename T>
void delete_from_map(int id, std::map< int, T > mymap){
for (auto it = mymap.begin(); it != mymap.end(); it++){
if(it->first == id){
mymap.erase(it);
break;
}
}
}
但是,编译尝试给我四个地图中的每一个的未定义参考错误。错误如下所示:
error: undefined reference to `void DVis::delete_from_map<QListWidgetItem*>(int, std::map<int, QListWidgetItem*, std::less<int>, std::allocator<std::pair<int const, QListWidgetItem*> > >)'
我在这里做错了什么?
解决方案
首先,不需要像在 map 中那样使用 for 循环,您可以直接按值删除元素,其次,在 map 中迭代时删除不是一个好主意,因为它可能导致迭代器失效(检查:http://高级cpptopics.blogspot.com/)。正如 OP 指出并由其他人验证的那样,有问题的代码是正确的,但如果我们使用可变参数模板可能会更好,因为将来您可能会遇到编写自己的分配器等的情况。因此建议您尝试以下版本:
template<typename... Args>
void delete_from_map(int id,std::map<int,Args...>& m)
{
m.erase(id);
}
推荐阅读
- python - 如何忽略beautifulsoup4 python上的标签
- java - 通过 udp 从服务器向客户端传递双精度值时非法长度或偏移量
- python - 创建一个自定义超级用户作为我参加的课程的一部分
- android-studio - Kotlin 的安全转换(或在此上下文中为“不安全”转换)隐藏了 Android Studio 可能发出的 NullPointerException 警告
- sql - 如何保存Oracle中子查询的内部查询结果中的值
- c# - 如何在单个 foreach 中匹配两个字符串?
- node.js - 当我尝试使用 Parcel 构建在开发模式下运行良好的 React 应用程序的生产版本时,我得到“找不到模块 'sass'”
- google-analytics - (加速移动页面)AMP 分析
- go - 如何使用地图中的值
- javascript - 在AngularJS中对具有不同参数的同一个API函数进行多次异步调用