- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面函数模板的目标是取任意unordered_map
并产生一个新的unordered_map
与 key_type
和 mapped_type
倒。下面的函数适用于 std::unorderd_map
.我希望它还能为 EITHER std::unordered_map
工作和任何 STL hashmap 模拟。
我想维护的另一个好处是,在调用函数时,如果需要默认行为,auto inversion = InvertHashMap(someIntStringMap)
没有模板参数。但是,如果我确实提供了有效的初始模板参数,我可以覆盖默认的哈希器,例如用于构建倒置映射的。
我很难使容器通用,同时仍然提供基于该容器的 5 个模板参数的默认模板参数。一旦我将容器本身作为模板参数,重载解析就会失败,编译也会失败。
我很乐意让关联容器成为唯一的模板参数,但是影响输出容器模板参数的能力就丢失了,至少在我的非灵活示例中它们可以显式模板化的方式是这样。
#include <unordered_map>
#include <utility>
#include <functional>
#include <memory>
template <typename InKeyType,
typename InValueType,
typename InHasher,
typename InEq,
typename InAlloc,
typename OutHash = std::hash<InValueType>,
typename OutEq = std::equal_to<InValueType>,
typename OutAlloc=std::allocator<std::pair<constInValueType,InKeyType>>>
std::unordered_map<InValueType, InKeyType, OutHash, OutEq, OutAlloc>
InvertMap(const std::unordered_map<InKeyType, InValueType, InHasher, InEq, InAlloc>& source)
{
std::unordered_map<InValueType, InKeyType, OutHash, OutEq, OutAlloc> outMap;
for (const auto& sourceKVPair : source)
outMap[std::get<1>(sourceKVPair)] = std::get<0>(sourceKVPair);
return outMap;
}
//in a .cpp
unordered_map<int,string> um;
auto newUM = InvertHashMap(um); //works well; newUM::key_type is string
我希望能够调用 InvertMap(aIntStringUnorderedMap)
还有InvertMap< int, string, hash<int>, ..., MyCustomStringHasher>(aIntStringHashMapLikeClass)//producing a HashMapLikeClass<string,int, MyCustomStringHasher,...defaults>
TLDR:如何在不更改调用站点语义的情况下将争论的容器及其模板参数引入模板?
编辑。这是我尝试使用容器作为唯一的模板参数。
template <typename AssocCont>
auto InvertCompliantHashMapThatIsntSTDUnorderedMap(const AssocCont&)
{
typedef typename AssocCont::key_type InKeyType;
typedef typename AssocCont::mapped_type InMappedType;
typedef typename AssocCont::value_type InPairConstruct;
typedef typename AssocCont::hasher InHasher;
typedef typename AssocCont::key_equal InEq;
//...
}
//But now there is no external means of desginating the new container's hasher,equality functor etc...
//And as it turns out, I cant even instantiate a new return object from AssocCont<InKeyType,InMappedType> since it is a distinct and unknown type
AssocCont<InMappedType,InKeyType> outmap = AssocCont<InMappedType,InKeyType>(); // nope. equivalent to object<key,value><otherkey,othervalue>()
双重编辑:为了提供示例,我选择了 std::map
。作为替代参数示例,我意识到它没有哈希器,也没有五个模板参数。所以我的问题的基础仍然是试图使这个功能多样化,但特别针对具有五个自己的模板参数且行为兼容的参数......。我已经编辑了我的帖子以减轻这种疏忽。
最佳答案
我觉得这可能会以类似于 standard algorithms library 的方式更好地实现.换句话说,将您的反演函数设计为将一系列迭代器放入输入容器并将迭代器放入输出容器。它将更易于实现并为用户提供更大的灵 active 。此外,只要输入和输出迭代器满足特定条件(可能由 concepts 强加),它就会在某种程度上独立于容器类型。这是一个示例,它可能不是您想要的,但您可以修改它以满足您的需要:
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <unordered_map>
namespace
{
template <class InputIt, class OutputIt>
void inverse_map(InputIt start, InputIt stop, OutputIt d_first)
{
while(start != stop)
{
*d_first = {start->second, start->first} ;
++d_first ;
++start ;
}
}
} // anonymous namespace
int main()
{
std::map<int, std::string> map_1 {{1, "foo"}, {2, "bar"}, {3, "foo"}} ;
std::unordered_map<std::string, int> map_2 ;
//
// Or, you can use:
//
// std::unordered_map<std::string, int, MyCustomHasher> map_2 ;
//
inverse_map(map_1.begin(), map_1.end(), std::inserter(map_2, map_2.end())) ;
for(const auto& [key, value]: map_2) // requires C++17
std::cout << key << ": " << value << "\n" ;
return 0;
}
输出:
bar: 2
foo: 1
在线试用 here .
关于c++ - 尝试(稍微)概括 C++ 模板。关联容器 key :Value Inversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52549351/
我正在寻找一种简单的方法来编写函数 mapAndUnzip :: (Functor f) => (a -> (b,c)) -> f a -> (f b, f c) 我并不完全相信 Functor是一个
我的代码是这样的: if(country == china) { getCNData(); } else { getDefaultDataForallCountries(); } 现在我需要为其他国家
在处理使用类型类模式的 Scala 项目时,我遇到了语言如何实现模式的严重问题:由于 Scala 类型类实现必须由程序员而不是语言管理,因此任何变量属于一个类型类永远不会被注解为父类型,除非它的类型类
我正在尝试在 R 中创建一个公式,其形式为 输出~Var1+Var2+Var3 用于模型。它的工作方式似乎是你给你想要预测的变量名,波浪号,你想用作预测变量的变量名,然后在后面的参数中你给出包含这些变
我正在使用一堆类型的宏: #define Q31_TO_Q30 (31-30) #define Q31_TO_Q20 (31-20) #define Q25_TO_Q15 (25-15) etc. 我
为了提高工作效率,我使用以下函数来了解我必须为哪些函数设置别名,因为我最常使用它们: function mu() { if [[ $# -eq 0 ]]; then histo
我有几个文本框。我想在每次按下回车键时将用户指向下一个文本框。文本框已正确设置 Tabindex。 我有这样的东西: private void textBox_Description_KeyPres
有什么方法可以将列约束应用于我的所有 GridPanes 列。我有各种 GridPane 控件,我希望它们共享以下列约束: 可以用css来实现吗? 编辑 我最终做了这样的事情。但它不起作用(我的列宽
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我正在做一个 JavaScript 游戏作业,只是尝试玩一下 Canvas 。我的任务是使用激光源、镜子和目标物体进行激光游戏。 我刚刚做了一个丑陋的硬编码示例: 'use strict'; func
我正在尝试从任何公共(public) REST API 获取响应并对其进行处理(解析并放入数据结构)。从 API 获取此响应时,我想使用一些分页功能。我提到了this ,该问题讨论了特定 API 的分
我有一个与 Guice 的机器人腿示例非常相似的用例,只是我不知道我有多少条“腿”。因此我不能使用机器人腿示例所需的注释。 我希望使用 Guice 的 Multibindings 扩展将所有这些“腿”
(按标题道歉,我不能做得更好) 我的问题是找到一些通用的结构或“标准”函数来执行下一件事: xmap :: (a -> b) -> f a -> g b 然后,我们不仅可以映射元素,还可以映射整个结构
haskell 中是否有一个函数可以概括 Maybe 和 Either 函数? 例如,我正在想象一个这样的函数: generalizedFunc :: SOMETHING m => b -> (a -
下面函数模板的目标是取任意unordered_map并产生一个新的unordered_map与 key_type和 mapped_type倒。下面的函数适用于 std::unorderd_map .我
我是一名优秀的程序员,十分优秀!