0

私はこの状況を持っています:

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);

でもあまり効率的とは思えない…

4

2 に答える 2

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;
    }
}
于 2013-02-23T19:48:43.023 に答える
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());

デモ

于 2013-02-23T20:26:18.100 に答える