我需要将矢量bacward_segment
中的所有元素按相反的顺序推送到forward_segment
。
这是我的代码:
for(int q = backward_segment.size()-1; q >= 0; q--){
forward_segment.push_back(backward_segment[q]);
}
但我觉得效率不高..你能给我一个更好的解决方案吗?
答案 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_segment
到backward_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;
} );
它会使它更具可读性(在我看来),但是复杂性几乎相同。