CppLinq的擴充
// cpplinqex.hpp#include "cpplinq.hpp"namespace cpplinq{ namespace detail{template<typename TKeyPredicate, typename TSelector>struct to_groups_selector_builder : base_builder{typedefto_groups_selector_builder<TKeyPredicate, TSelector> this_type ;typedef TKeyPredicate key_predicate_type ;typedef TSelectorselector_type;key_predicate_type key_predicate ;selector_typeselector ;CPPLINQ_INLINEMETHOD explicit to_groups_selector_builder (key_predicate_type key_predicate, selector_type selector) throw (): key_predicate (std::move (key_predicate)), selector(std::move (selector)){}CPPLINQ_INLINEMETHOD to_groups_selector_builder (to_groups_selector_builder const & v): key_predicate(v.key_predicate), selector(v.selector){}CPPLINQ_INLINEMETHOD to_groups_selector_builder (to_groups_selector_builder && v) throw (): key_predicate(std::move (v.key_predicate)), selector(std::move (v.selector)){}template<typename TRange>CPPLINQ_INLINEMETHOD std::map<typename get_transformed_type<key_predicate_type, typename TRange::value_type>::type, std::vector<typename get_transformed_type<selector_type, typename TRange::value_type>::type>> build (TRange range){std::map<typename get_transformed_type<key_predicate_type, typename TRange::value_type>::type, std::vector<typename get_transformed_type<selector_type, typename TRange::value_type>::type>> groupings;while (range.next ()){auto value = range.front ();auto key = key_predicate (value);groupings[key].push_back (selector (value));}return std::move (groupings);}};}template<typename TKeyPredicate, typename TSelector>CPPLINQ_INLINEMETHOD detail::to_groups_selector_builder<TKeyPredicate, TSelector> to_groups (TKeyPredicate key_predicate, TSelector selector) throw (){return detail::to_groups_selector_builder<TKeyPredicate, TSelector>(std::move (key_predicate), std::move (selector));}}
靜夜思
#include <iostream>#include <local.h>#include "cpplinqex.hpp"using namespace std;using namespace cpplinq;void print(wstring const& text, int offset){auto groupings = from(text)>> zip_with(range(0, text.length()))>> to_groups([=](pair<wchar_t, int> const& p){return p.second % offset;},[](pair<wchar_t, int> const& p){return wstring(1, p.first);});for(auto const& kvs : groupings){auto v = from(kvs.second)>> reverse()>> concatenate(L"|");wcout << v << endl;}}int main(){setlocale(LC_ALL, "chs");print(L"床前明月光疑是地上霜舉頭望明月低頭思故鄉", 5);}//低|舉|疑|床//頭|頭|是|前//思|望|地|明//故|明|上|月//鄉|月|霜|光