第一步:使它適用於C風格的數組。
第二步:使用基於範圍的for循環。更少的問題/努力。
第三步:使用模板別名更好一點。
#include <iostream>
#include <map>
#include <deque>
#include <cstdint>
#include <functional>
#include <algorithm>
#include <iterator>
template < typename Elem, typename Res >
using return_type = std::multimap < typename std::remove_reference<Elem>::type,
Res>;
template<typename Cont, typename F >
auto group_by (Cont const& c, F const& f)
-> return_type < decltype(*std::begin(c)), decltype(f(*std::begin(c))) >
{
return_type< decltype(*std::begin(c)),
decltype(f(*std::begin(c))) > result;
for(auto const& e : c)
{
auto const& key = f(e);
result.insert(std::make_pair(key,e));
// alternatively, just:
// result.emplace(f(e), e);
}
return result;
}
int main()
{
char const foo[] = "hello world";
auto result = group_by(foo, [] (uint64_t x){return x%10;});
}
視覺工作室支持的版本:
template < typename Cont, typename F >
auto group_by (Cont const& c, F const& f)
-> std::multimap
<
typename std::remove_reference<decltype(*std::begin(c))>::type,
decltype(f(*std::begin(c)))
>
{
using key_ref = decltype(*std::begin(c));
using key_type = typename std::remove_reference <key_ref> :: type;
using value_type = decltype(f(*std::begin(c)));
std::multimap < key_type, value_type > result;
for(auto const& e : c)
{
result.emplace(f(e), e);
}
return result;
}
第四步:使用迭代器而不是傳遞的容器。
#include <iostream>
#include <map>
#include <deque>
#include <cstdint>
#include <functional>
#include <algorithm>
#include <iterator>
template < typename Elem, typename Res >
using return_type = std::multimap< typename std::remove_reference<Elem>::type,
Res >;
template < typename FwdIt, typename F >
auto group_by (FwdIt beg, FwdIt end, F const& f)
-> return_type < decltype(*beg), decltype(f(*beg)) >
{
return_type < decltype(*beg), decltype(f(*beg)) > result;
for(FwdIt i = beg; i != end; ++i)
{
result.emplace(f(*i), *i);
}
return result;
}
int main()
{
char const foo[] = "hello world";
auto result = group_by(std::begin(foo), std::end(foo),
[] (uint64_t x){return x%10;} );
}
視覺工作室支持的版本:
template < typename FwdIt, typename F >
auto group_by (FwdIt beg, FwdIt end, F const& f)
-> std::multimap
<
typename std::remove_reference<decltype(*std::begin(c))>::type,
decltype(f(*std::begin(c)))
>
{
using key_ref = decltype(*std::begin(c));
using key_type = typename std::remove_reference <key_ref> :: type;
using value_type = decltype(f(*std::begin(c)));
std::multimap < key_type, value_type > result;
for(FwdIt i = beg; i != end; ++i)
{
result.emplace(f(*i), *i);
}
return result;
}
如果你希望它爲C數組工作,你需要更換'類型名續:: value_type'在拉姆達。 – Yuushi
啊,對不起...是guestimating的東西,只改變了2個地方:)需要編輯Q,因爲我不能讓它爲陣列工作:) – NoSenseEtAl
猜測C風格的數組,你必須採取' c'由ref(const ref) – dyp