作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
给定
std::vector<T> first = /* some given data */, second;
我想移动所有满足某些条件cond(e)
的元素e
从first
到second
,即类似
move_if(std::make_move_iterator(first.begin()),
std::make_move_iterator(first.end()),
std::back_inserter(second), [&](T const& e)
{
return cond(e);
});
我无法使用 算法库 建立这一点。那么,我该怎么做呢?
最佳答案
如果被移动的元素可以留在它们在 first
中的位置,那么只需使用 copy_if
和 move_iterator
。
std::copy_if(std::make_move_iterator(first.begin()),
std::make_move_iterator(first.end()),
std::back_inserter(second), cond);
如果应该从 first
中删除移出的元素,我会这样做
// partition: all elements that should not be moved come before
// (note that the lambda negates cond) all elements that should be moved.
// stable_partition maintains relative order in each group
auto p = std::stable_partition(first.begin(), first.end(),
[&](const auto& x) { return !cond(x); });
// range insert with move
second.insert(second.end(), std::make_move_iterator(p),
std::make_move_iterator(first.end()));
// erase the moved-from elements.
first.erase(p, first.end());
或 partition_copy
带有 move_iterator
,然后是赋值:
std::vector<T> new_first;
std::partition_copy(std::make_move_iterator(first.begin()),
std::make_move_iterator(first.end()),
std::back_inserter(second), std::back_inserter(new_first), cond);
first = std::move(new_first);
关于c++ - 将满足某些条件的所有元素从一个容器移动到另一个容器,即我正在寻找某种 "move_if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32155810/
给定 std::vector first = /* some given data */, second; 我想移动所有满足某些条件cond(e)的元素e从first到second,即类似 move_
我在 Internet 上看到一些地方描述了将 std::copy_if 与 std::make_move_iterator 一起使用,但是如果迭代器是前向的迭代器,这将导致在源容器周围散布有效但未指
我是一名优秀的程序员,十分优秀!