以相反的顺序将元素从向量A移动到向量B(非空)

时间:2016-10-12 16:40:08

标签: c++ vector

我需要将矢量bacward_segment中的所有元素按相反的顺序推送到forward_segment

这是我的代码:

for(int q = backward_segment.size()-1; q >= 0; q--){
                forward_segment.push_back(backward_segment[q]);
        }

但我觉得效率不高..你能给我一个更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

如果复制足够

如果您正在初始化forward_segment,那就像

一样简单
vector<T> forward_segment(backward_segment.crbegin(), backward_segment.crend());

否则:

forward_segment.resize(backward_segment.size());
copy(backward_segment.crbegin(), backward_segment.crend(), forward_segment.begin());

如果您确实需要移动元素

使用make_move_iterator(请注意,我没有使用const迭代器)。

初​​始化:

vector<T> forward_segment(
    make_move_iterator(backward_segment.rbegin()),
    make_move_iterator(backward_segment.rend())
);

否则:

forward_segment.resize(backward_segment.size());
copy(
    make_move_iterator(backward_segment.rbegin()),
    make_move_iterator(backward_segment.rend()),
    forward_segment.begin()
);

答案 1 :(得分:1)

  

但我觉得效率不高......

你不应该“思考”这个。请改用探查器。猜测的优化几乎从不起作用。

  

你能给我一个更好的解决方案吗?

如果您预计不会跳过太多重复项,则可以保留forward_segmentbackward_segment的大小。可以在算法级别上进行更好的优化,例如完全跳过整个副本,但是您没有提供足够的信息。

您可以使用std::unique_copy

std::unique_copy( backward_segment.rbegin(), backward_segment.rend(),
                  std::back_inserter( forward_segment ),
                  []( const auto &s1, const auto &s2 ) {
                       return s1.x == s2.x && s1.y == s2.y;
                  } );

它会使它更具可读性(在我看来),但是复杂性几乎相同。