0

C++ でLambda 関数を使用する方法を理解したいです。

次のように、カスタムタイプを使用しています。

struct my_toy_t {
    uint32_t    id;
    cv::Rect    box;
    cv::Mat     data;
}

typedef std::map<uint32_t, my_toy_t*> my_toy_map_t;

と:

int main() {

    my_toy_map_t input_map;
    my_toy_map_t output_map;

    // Some insertions in input_map...

    my_toy_map_t::iterator it;
    for (it = input_map.begin(); it != input_map.end(); ++it)
    {
        if (check_cond(it->second->box)) {
            output_map.insert(std::make_pair(it->first, it->second));
            input_map.erase(it->first);
        }
    }
    return 0;
}

bool check_cond(cv::Rect box) {
    if (box.area > 100)
        return true;
    else
        return false;
}

my_toy_map_tは単なる でありstd::map<uint32_t, my_toy_t*>check_cond関数は単純な条件をチェックすることに注意してください。

Lamba関数を使用して、このコード ( ifへの挿入と if からの削除) を変換することは可能ですか?output mapinput_mapcheck_condtrue

4

3 に答える 3

2

かもしれませんstd::copy_ifstd::inserter ?

std::copy_if(input_map.begin(),input_map.end(),
             std::inserter(output_map,output_map.end()) ,
    [](const std::pair<uint32_t, my_toy_t*>& x ){ 
                             return (x.second)->box.area > 100;    
                              } 
                );

削除するには、次のように考えることができます:

my_toy_map_t temp;

std::remove_copy_if(input_map.begin(), input_map.end(), 
                    inserter(temp, temp.end()),
                    [](const std::pair<uint32_t, my_toy_t*>& x ){ 
                                 return (x.second)->box.area > 100;    
                                  } );

input_map.swap(temp);
于 2013-08-15T10:56:52.487 に答える
1

ラムダでstd::for_eachを使用できますmutable

std::for_each(input_map.begin(), input_map.end(),
         [&output_map](const std::pair<uint32_t,my_toy_t*> &it) mutable{
    //   ^^                                                     ^^^^^^^
         if (it.second->box.area > 100)
         {
             output_map.insert(it);
         }
    });

提案: smart pointers + STL containerraw pointers の代わりに使用することをお勧めしますraw pointer + STL container

于 2013-08-15T10:54:44.043 に答える