C++ 模板函数分组值的更优雅的方式? 以下代码为具有通用分组lambda的任何容器分组值: 模板 自动分组值(迭代器开始、迭代器结束、GroupingFunc GroupingFunc){ 地图组; 对于每个人(开始、结束、, [&groups,groupingFunc](常量自动(&val){ 组[groupingFunc(val)]。推回(val); } ); 返回组; }

C++ 模板函数分组值的更优雅的方式? 以下代码为具有通用分组lambda的任何容器分组值: 模板 自动分组值(迭代器开始、迭代器结束、GroupingFunc GroupingFunc){ 地图组; 对于每个人(开始、结束、, [&groups,groupingFunc](常量自动(&val){ 组[groupingFunc(val)]。推回(val); } ); 返回组; },c++,lambda,decltype,C++,Lambda,Decltype,使用以下用法: int main() { list<string> strs = {"hello", "world", "Hello", "World"}; auto groupOfStrings = groupValues(strs.begin(), strs.end(), [](auto& val) { return (char)toupper(val.at(0));

使用以下用法:

int main() {
    list<string> strs = {"hello", "world", "Hello", "World"};
    auto groupOfStrings =
        groupValues(strs.begin(), strs.end(), 
            [](auto& val) {
                return (char)toupper(val.at(0));
        });
    print(groupOfStrings); // assume a print method

    list<int> numbers = {1, 5, 10, 24, 13};
    auto groupOfNumbers =
        groupValues(numbers.begin(), numbers.end(), 
            [](int val) {
                int decile = int(val / 10) * 10;
                return to_string(decile) + '-' + to_string(decile + 9);
        });
    print(groupOfNumbers); // assume a print method
}
intmain(){
列表STR={“你好”、“世界”、“你好”、“世界”};
自动分组字符串=
组值(strs.begin()、strs.end(),
[](自动和val){
返回(char)toupper(val.at(0));
});
print(groupOfstring);//采用打印方法
列表编号={1,5,10,24,13};
数字的自动分组=
组值(numbers.begin()、numbers.end(),
[](int-val){
整数十分位数=整数(val/10)*10;
返回到_字符串(十进制)+'-'+到_字符串(十进制+9);
});
print(groupOfNumbers);//采用打印方法
}
对于在
groupValues
函数中使用declvaldecltype,我有点不情愿

你认为有更好的写作方法吗? (这个问题主要是为了更好的风格和清晰度,当然,除非你们看到任何其他问题)



代码:

我可能会将最后两个模板参数移动到函数中,并使用的std::result\u提供一个稍微整洁的函数:

template <typename T>
using deref_iter_t = std::remove_reference_t<decltype(*std::declval<T>())>;

template<class Iterator, class GroupingFunc>
auto groupValues(Iterator begin, Iterator end, GroupingFunc groupingFunc) {
    using T = deref_iter_t<Iterator>;
    using GroupingType = std::result_of_t<GroupingFunc(T&)>;
    std::map<GroupingType, std::list<T>> groups;
    std::for_each(begin, end, [&groups, groupingFunc](const auto& val){
        groups[groupingFunc(val)].push_back(val);
    });
    return groups;
}
模板
使用deref_iter_t=std::remove_reference_t;
模板
自动分组值(迭代器开始、迭代器结束、GroupingFunc GroupingFunc){
使用T=deref_iter_T;
使用GroupingType=std::result\u of\u t;
地图组;
std::for_each(开始、结束、[&groups、groupingFunc](常量自动和val){
组[groupingFunc(val)]。推回(val);
});
返回组;
}

这个问题更适合你吗?@Paul Rooney有没有一个简单的方法把它移到那里?或者只是复制删除。。。?谢谢,我不太清楚。您可以要求主持人将问题迁移,或者直接复制。谢谢!我不知道的
std::result\u,我自己在上面实现了它(现在想想,有趣的是,为什么该语言没有实现deref\u迭代器操作)。看来你的版本就是我所寻求的改进。
template <typename T>
using deref_iter_t = std::remove_reference_t<decltype(*std::declval<T>())>;

template<class Iterator, class GroupingFunc>
auto groupValues(Iterator begin, Iterator end, GroupingFunc groupingFunc) {
    using T = deref_iter_t<Iterator>;
    using GroupingType = std::result_of_t<GroupingFunc(T&)>;
    std::map<GroupingType, std::list<T>> groups;
    std::for_each(begin, end, [&groups, groupingFunc](const auto& val){
        groups[groupingFunc(val)].push_back(val);
    });
    return groups;
}