【发布时间】:2013-05-20 01:39:07
【问题描述】:
我正在以一种通用的方式实现 group_by 方法,我可能已经实现了它(除了它不适用于 C 数组),但代码在我看来仍然很难看...
有没有更简单的方法来做我想做的事(+ 让它适用于所有容器和 C 数组(我不知道如何让它适用于 C 数组 (TT))?
如果不是很明显,我正在谈论 std::multimap 的类型......
顺便说一句,我知道 C++14 将不再需要输入 2 次(自动知道我们现在写的类型是什么 ->)
// group_by.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <map>
#include <deque>
#include <cstdint>
#include <functional>
#include <algorithm>
#include <iostream>
template<typename Cont, typename F >
auto group_by (Cont c, F f) -> std::multimap< typename std::remove_reference<decltype(*std::begin(c))>::type, decltype(f(*std::begin(c)))>
{
std::multimap<typename std::remove_reference<decltype(*std::begin(c))>::type , decltype(f(*std::begin(c)))> result;
std::for_each(std::begin(c), std::end(c),
[&result,&f](typename Cont::value_type elem)
{
auto key = f(elem);
result.insert(std::make_pair(key,elem));
}
);
return result;
}
int main()
{
std::deque<uint64_t> dq;
std::deque<uint64_t>::value_type asghuitl;
dq.push_back(1);
dq.push_back(2);
dq.push_back(11);
dq.push_back(21);
auto result = group_by(dq, [] (uint64_t x){return x%10;});
}
【问题讨论】:
-
如果您希望它适用于 C 数组,您需要在 lambda 中替换
typename Cont::value_type。 -
啊,对不起...是在猜测东西并且只在 2 个地方进行了更改 :) 需要编辑 Q,因为我无法让它适用于数组 :)
-
猜猜 C 风格的数组,你必须通过 ref (const ref) 取
c -
为什么不使用基于范围的 for 循环而不是
for_each? -
@NoSenseEtAl 或者使用迭代器版本(见答案)。
标签: c++ c++11 template-meta-programming decltype