[英]std::vector move reverse iterator at end
我有這種情況:
for(auto it = vec.rbegin(); it != vec.rend(); ++it)
{
if(condition(it))
{
//Move it at end;
break;
}
}
在vec
末尾移動*it
的最有效/最優雅的方法是什么?
編輯: *it
,不是it
EDIT1:現在我使用:
auto val = *it;
vec.erase((++it).base());
vec.push_back(val);
但是我認為效率不是很高...
要將其移至末尾:
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;
}
}
如果更喜歡標准算法而不是手動循環。 因此,我將使用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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.