【发布时间】:2016-12-24 18:30:18
【问题描述】:
我有一些 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 将向量转换为地图。我的问题是,有时,如图所示,我不想从我的 lambda 函数返回任何内容,即我基本上想跳过 i 并转到下一个(不向地图添加任何内容)。
有什么方法可以实现我的想法吗?如果有帮助,我可以使用 boost。我想避免一个解决方案,我必须对我的向量进行预处理或后处理以过滤掉“坏”项目;我应该只需要查看每个项目一次。另外,我的实际逻辑比写的 if/else 复杂一些,所以我认为如果可能的话,将东西封装在这个 std::transform/lambda 模型中会很好(尽管可能是我想要实现的这个模型是不可能的)。
编辑:只是强调一下,我希望以最有效的方式执行此操作(选择性地处理矢量元素并将它们插入到地图中),即使这意味着不太优雅的解决方案或大的重写。我什至可以根据最有效的方式使用不同的地图数据类型。
【问题讨论】:
-
就我个人而言,我会编写一个
transform_if模板函数——它会反映copy_if等其他算法的命名方案,并保持生成的代码简单易懂。 -
迟了半年的评论,但是对于每个循环和在地图中插入元素的简单操作对您不起作用?
-
@Zoso 我现在没有代码在我面前,但可以想象:我在某个地方存储了一个 lambda,我的代码的各个部分用于执行这种类型的处理/过滤(也许我什至有一组用于不同过滤器的 lambdas 等)。所以在那种情况下,我被困在使用 lambdas 中;我希望我的 lambdas 进行处理,而不仅仅是返回 true/false 是否应该完成处理。如果检查某个项目的坏处的逻辑非常复杂,我希望将该逻辑隐藏在 lambda 中(不再重复)。所以 transform_if + lambda 可能比 foreach + badness 检查更干净。