std::vector在末尾移动反向迭代器
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
第1版:现在我使用:
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;
}
}
If更喜欢标准算法而不是手动循环。所以我会使用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());
演示
相关文章:
- 使用std::multimap迭代器创建std::list
- C++移动迭代器 N 次
- 在 stl 算法中移动迭代器
- 如何在基于范围的 for 循环中更改(向前/向后移动)迭代器?
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 无法使用迭代器擦除矢量元素,矢量元素实现移动构造函数
- 如何使用移动语义迭代器和模板
- 迭代器进入被移动的容器
- 设置迭代器因移动语义失效
- 仅移动输入和输出迭代器
- std::list-是在移动时无效的迭代器
- 具有移动结束()的前向迭代器
- 不能移动集合迭代器
- 在vector中的vector之间移动指针会导致vector迭代器不兼容
- 我是否需要知道算法的代码才能利用插入器和移动迭代器?
- 使用先前已移动的输出迭代器调用move()是标准的c++吗?
- std::vector在末尾移动反向迭代器
- visual C++标准是否要求自己的迭代器是另一个可移动/可复制的
- C++std::list迭代器是否可以移动到末尾
- 为什么在c++ 11中所有的迭代器/迭代器适配器都不能移动?