STL 向量:移动向量的所有元素
我有两个 STL 向量 A
和 B
,我想清除 A
的所有元素并移动 的所有元素>B
到 A
然后清除 B
.简单地说,我想这样做:
I have two STL vectors A
and B
and I'd like to clear all elements of A
and move all elements of B
to A
and then clear out B
. Simply put, I want to do this:
std::vector<MyClass> A;
std::vector<MyClass> B;
....
A = B;
B.clear();
由于 B
可能很长,所以需要 k*O(N)
来完成这个操作,其中 k
是一个常数,而 N
是 max(size_of(A), size_of(B))
.我想知道是否有更有效的方法来做到这一点.我能想到的一件事是将A
和B
定义为指针,然后在恒定时间内复制指针并清除B
.>
Since B
could be pretty long, it takes k*O(N)
to do this operation, where k
is a constant, and N
is max(size_of(A), size_of(B))
. I was wondering if there could be a more efficient way to do so. One thing that I could think of is to define A
and B
as pointers and then copy pointers in constant time and clear out B
.
推荐答案
使用 C++11,就这么简单:
Using C++11, it's as simple as:
A = std::move(B);
现在 A
包含以前由 B
持有的元素,而 B
现在是空的.这避免了复制:内部表示只是从 B
移动到 A
,所以这是一个 O(1)
解决方案.
Now A
contains the elements that were previously held by B
, and B
is now empty. This avoids copying: the internal representation is simply moved from B
to A
, so this is an O(1)
solution.
至于 C++03,正如Pr?torian 所说,您可以交换向量.std::swap
函数有一个特例,它以 std::vector
s 作为参数.这有效地交换了内部表示,因此您最终避免创建它们持有的元素的副本.此函数也适用于 O(1)
复杂度.
As for C++03, as Pr?torian states, you could swap the vectors. There is a specialization of the std::swap
function, which takes std::vector
s as its arguments. This effectively swaps the internal representation, so you end up avoiding creating copies of the elements held by them. This function works in O(1)
complexity as well.
相关文章