5

假设我有一个带有成员变量的类:

std::unordered_map<KeyType, std::shared_ptr<ValueType>> myMap

在成员函数中,我想执行以下操作:

std::for_each(myMap.begin(), myMap.end(), [](std::pair<const KeyType, std::shared_ptr<ValueType>>& pair){pair.second->someMethod(); });

有没有办法缩短 lambda 表达式?我以为我可以做到这一点,但它不是有效的语法:

std::for_each(myMap.begin(), myMap.end(), [](decltype(myMap::valueType)& pair){pair.second->someMethod(); });
4

3 回答 3

9

我根本不会打扰 lambda。与其他标准算法不同,for_each()它并不比等效的for.

for (auto& p : myMap)
    p.second->someMethod();

for (auto p = myMap.begin(); p != myMap.end(); ++p)
    p->second->someMethod();
于 2012-04-28T18:08:07.620 回答
5

我推荐typedef像 assoc 容器这样的复杂模板,因此您可以执行以下操作:

typedef std::unordered_map<KeyType, std::shared_ptr<ValueType>> map_type;

map_type myMap;

//do with map

std::for_each(myMap.begin(), myMap.end(), 
    [](typename map_type::value_type& pair){
        pair.second->someMethod(); 
});

或没有 typedef

std::for_each(myMap.begin(), myMap.end(), 
    [](typename decltype(myMap)::value_type& pair){
        pair.second->someMethod(); 
});

decltype 获取对象的类型,您需要使用模板类中定义的类型名,为此您使用typename关键字。如果模板特化没有该 typedef,这是必要的。

于 2012-04-28T17:53:00.853 回答
0

我制作了一个宏,如下所示://从容器名称中推断出匿名 lambda 类型

#define _A(container)\
  std::remove_reference<decltype(*std::begin(container))>::type

在您的情况下,用作:

std::for_each(myMap.begin(), myMap.end(), [](_A(myMap)& pair) {
  pair.second->someMethod(); 
});

注意: 如果remove_reference键入 ,则需要保留常量[](const _A(myMap)& pair),否则&删除const声明。

于 2012-04-28T18:11:47.413 回答