gpt4 book ai didi

c++ - std::transform with lambda: 跳过一些项目

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:19 25 4
gpt4 key购买 nike

我有一些 C++11 代码,比如

std::vector<std::string> names;
std::map<std::string, std::string> first_to_last_name_map;
std::transform(names.begin(), names.end(), std::inserter(first_to_last_name_map, first_to_last_name_map.begin()), [](const std::string& i){
if (i == "bad")
return std::pair<std::string, std::string>("bad", "bad"); // Don't Want This
else
return std::pair<std::string, std::string>(i.substr(0,5), i.substr(5,5));
});

我正在使用带有 lambda 函数的 std::transform 将 vector 转换为 map 。我的问题是有时,如图所示,我不想从我的 lambda 函数返回任何东西,即我基本上想跳过那个 i 并转到下一个(不向 map 添加任何东西).

有什么办法可以实现我想的吗?如果有帮助,我可以使用 boost。我想避免必须对 vector 进行预处理或后处理以过滤掉“坏”项目的解决方案;我应该只需要看一次每个项目。此外,我的实际逻辑比编写的 if/else 更复杂一些,所以我认为如果可能的话,将东西封装在这个 std::transform/lambda 模型中会很好(尽管也许是我想要实现的使用此模型是不可能的)。

编辑:只是强调一下,我希望以最有效的方式执行此操作(有选择地处理 vector 元素并将它们插入 map ),即使这意味着不太优雅的解决方案或大的重写。我什至可以根据最有效的方式使用不同的 map 数据类型。

最佳答案

template<class Src, class Sink, class F>
void transform_if(Src&& src, Sink&& sink, F&& f){
for(auto&& x:std::forward<Src>(src))
if(auto&& e=f(decltype(x)(x)))
*sink++ = *decltype(e)(e);
}

现在只需获得 boost 或标准或标准体验可选。有你的f返回 optional<blah> .

auto sink = std::inserter(first_to_last_name_map, first_to_last_name_map.begin());
using pair_type = decltype(first_to_last_name_map)::value_type;

transform_if(names, sink,
[](const std::string& i)->std::optional<pair_type>{
if (i == "bad")
return {}; // Don't Want This
else
return std::make_pair(i.substr(0,5), i.substr(5,5));
}
);

我个人首选的可选实际上已经定义了开始结束。我们得到这个算法:

template<class Src, class Sink, class F>
void polymap(Src&& src, Sink&& sink, F&& f){
for(auto&& x:std::forward<Src>(src))
for(auto&& e:f(decltype(x)(x)))
*sink++ = decltype(e)(e);
}

现在让 f返回一个范围,其中可选的是零或一个元素范围的模型。

关于c++ - std::transform with lambda: 跳过一些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com