我遇到这种情况:
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);
但我认为效率不高......
答案 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());