std :: vector在结束时移动反向迭代器

时间:2013-02-23 19:38:59

标签: c++ iterator

我遇到这种情况:

for(auto it = vec.rbegin(); it != vec.rend(); ++it)
{
    if(condition(it))
    {
        //Move it at end;
        break;
    }
}

*it结束时移动vec的最有效/优雅方式是什么?

编辑:*it,而不是it

EDIT1:现在我用:

auto val = *it; 
vec.erase((++it).base());
vec.push_back(val);

但我认为效率不高......

2 个答案:

答案 0 :(得分:3)

将其移至最后:

for(auto it = vec.rbegin(); it != vec.rend(); ++it)
{
    if(condition(it))
    {
        auto val = *it;
        vec.erase((++it).base());
        vec.push_back(val);
        break;
    }
}

与最后一个元素交换:

for(auto it = vec.rbegin(); it != vec.rend(); ++it)
{
    if(condition(it))
    {
        auto it2 = --vec.end();
        auto val = *it;
        *it = *it2;
        *it2 = val;
        break;
    }
}

答案 1 :(得分:1)

如果比手动循环更喜欢标准算法。所以我会使用std::find_if

如果您需要保留元素的顺序,可以使用std::rotate移动到最后:

auto rit = std::find_if(vec.rbegin(), vec.rend(), [](int i){ return i == 6; });
if (rit != vec.rend()) {
    auto it = rit.base();
    std::rotate(it-1, it, vec.end());
}

如果您不需要保留订单,可以使用std::iter_swap

auto it = std::find_if(vec.rbegin(), vec.rend(), [](int i){ return i == 6; });
if (it != vec.rend())
    std::iter_swap(it, vec.rbegin());

Demo