如果未找到映射条目,则返回特定的映射条目而不是 map::end
Return specific map entry instead of map::end if no map entry was found
在 switch 语句中,如果其他情况都不适用,则可以指定默认返回值。我想对 std::map 做类似的事情,但我不确定是否有可能:如果没有键适合搜索,我可以让地图返回特定的值/条目而不是 map::end 吗?
示例(这是我最终想做的 - 我知道代码不起作用):
std::map<std::string, void* (*) (DataObject*)> commands; //Mapping functions to keys
commands["Test"] = function(DataObject d){doSomething();}
commands[Nothing else applies] = function(DataObject d){doSomethingElse();}
commands.find("Test")(someDataObject); // doSomething(); happens
commands.find("blabla")(someDataObject); //doSomethingElse(); happens because no other entry was found
这样的事情可能吗?
(另外,我在这个例子中使用函数指针的方式可能根本不起作用 - 我可以使用 cpp11 的 lambda 表达式来完成我想做的事情吗?
我不想使用开关子句,也不想要if(m.find(x) != m.end())
子句,也不想要更多 if-else。
您可以使用自己的函子和默认值:
struct MyFunctor: public std::function<void(DataObject*)> {
template <typename F>
MyFunctor (F &&f) : std::function<void(DataObject*)> (std::forward<F> (f)) { }
MyFunctor () : std::function<void(DataObject*)> (doSomethingElse) { }
};
假设doSomethingElse
是一个已经定义的函数。
然后你可以简单地做:
std::map<std::string, MyFunctor> commands; //Mapping functions to keys
commands["Test"] = [] (DataObject *) { }; // Assign from lambda
DataObject *myDataObject= new DataObject();
commands["Not Defined"] (myDataObject); // Call doSomethingElse
您可以使用模板轻松获得不同的默认值(在编译时定义MyFunctor
:
template <void (*DefaultFn) (DataObject*)>
struct MyFunctor: public std::function<void(DataObject*)> {
template <typename F>
MyFunctor (F &&f) : std::function<void(DataObject*)> (std::forward<F> (f)) { }
MyFunctor () : std::function<void(DataObject*)> (DefaultFn) { }
};
std::map<std::string, MyFunctor<doSomethingElse>> commands;
不,您不能在std::map
中使用该功能,因为当找不到键时std::map::find()
返回等于 end()
的迭代器,并且您无法取消引用它。因此,您要么需要使用if( m.find( "blah" ) == m.end() )
子句,要么使用其他std::map
的东西,或者使用所需的功能编写自己的类。
您可能具有特殊的值类型,其默认状态将具有您需要的功能,然后通过std::map::operator[]
而不是std::map::find()
但会产生副作用来访问它 - 对于您搜索的每个键,新条目将被添加到地图中。我怀疑这比有一个if()
条款更好的解决方案,但这取决于你。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- std::调用 end() 时出现多映射错误
- 无法使用end()获取映射的第二个字段
- 如果未找到映射条目,则返回特定的映射条目而不是 map::end