C ++,Lambdas,for_each和内存损坏

时间:2013-06-27 21:30:15

标签: c++ lambda

Action成为具有is_finished方法和数字tag属性的类。 让this->vactions成为std::vector<Action>

目的是迭代向量并识别那些已完成的动作, 将他们的标签存储在std::vector<unsigned int>中并删除操作。

我试着用lambdas和一点点玩,然后想出了一点 代码读得很好但导致内存损坏。 “扩展”版本, 另一方面,按预期工作。

我怀疑在remove_if部分犯规,但对于我的生活,我无法想象 出了什么问题。

以下是示例代码。

导致内存损坏

std::vector<unsigned int> tags;

auto is_finished=[p_delta](Action& action) -> bool  {return action.is_finished();};

//This is supposed to put the finished actions at the end of the vector and return
//a iterator to the first element that is finished.
std::vector<Action>::iterator nend=remove_if(this->vactions.begin(), this->vactions.end(), is_finished);

auto store_tag=[&tags](Action& action)
{
    if(action->has_tag()) 
    {
        tags.push_back(action->get_tag());  
    }
};

//Store the tags...
for_each(nend, this->vactions.end(), store_tag);

//Erase the finished ones, they're supposed to be at the end.
this->vaction.erase(nend, this->vaction.end());

if(tags.size())
{
    auto do_something=[this](unsigned int tag){this->do_something_with_tag(tag);};
    for_each(tags.begin(), tags.end(), do_something);
}   

另一方面,这可以按预期工作

std::vector<Action>::iterator   ini=this->vactions.begin(),
                end=this->vactions.end();

std::vector<unsigned int> tags;

while(ini < end)
{
    if( (*ini).is_finished())
    {
        if((*ini).has_tag())
        {
            tags.push_back((*ini).get_tag());
        }

        ini=this->vaction.erase(ini);
        end=this->vaction.end();
    }
    else
    {
        ++ini;
    }
}

if(tags.size())
{
    auto do_something=[this](unsigned int tag){this->do_something_with_tag(tag);};
    for_each(tags.begin(), tags.end(), do_something);
}   

我相信这里有一些新手的错误。你能帮我看一下吗?。

我认为for_each可以更新我的nend迭代器但是找到了 没有关于它的信息。如果它做了什么?向量是否可以尝试擦除超出“结束”点?

1 个答案:

答案 0 :(得分:3)

std::remove_if不会保留要删除的元素的值(请参阅cppreference)。要么在调用remove_if之前获取标记值 - 就像在第二种情况下那样 - 或者使用std::partition代替。