ami*_*far 47 c++ stl stdvector
我有两个STL向量A,B并且我想清除所有元素A并将所有元素移动B到A然后清除B.简单地说,我想这样做:
std::vector<MyClass> A;
std::vector<MyClass> B;
....
A = B;
B.clear();
Run Code Online (Sandbox Code Playgroud)
因为B可能很长,所以需要k*O(N)执行此操作,其中k是常量,并且N是max(size_of(A), size_of(B)).我想知道是否有更有效的方法可以做到这一点.我能想到的一件事是定义A和B作为指针,然后在恒定时间内复制指针并清除B.
mfo*_*ini 75
使用C++ 11,它很简单:
A = std::move(B);
Run Code Online (Sandbox Code Playgroud)
现在A包含以前所持的元素B,而B现在是空的.这避免了复制:内部表示只是简单地移动B到A,所以这是一个O(1)解决方案.
对于C++ 03,正如Prætorian所说,你可以交换向量.该std::swap函数有一个特化,它以std::vectors为参数.这有效地交换了内部表示,因此您最终避免创建它们所持有的元素的副本.此功能O(1)也很复杂.
Pra*_*ian 14
如果你有一个C++ 11编译器,你可以B进入A.
A = std::move(B);
Run Code Online (Sandbox Code Playgroud)
如果您正在使用较旧的编译器,那么只swap需要两个
A.swap(B);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,唯一的O(N)操作将清除内容A.在第一种情况下,清除将在赋值本身期间完成,而在第二种情况下,它将在B超出范围时发生(因为内容被交换).
小智 6
std::move 工作正常。这是相同的示例代码
vector<int> v1 = {1,2,3,10,20,30,100,200,300,999};
vector<int> v2;
cout << "Size of v1 before move = " << v1.size() << endl;
cout << "Capacity of v1 before move = " << v1.capacity() << endl;
v2 = std::move(v1);
cout << "Size of v2 after move = " << v2.size() << endl;
cout << "Capacity of v2 after move = " << v2.capacity() << endl;
cout << "Size of v1 after move = " << v1.size() << endl;
cout << "Capacity of v1 after move = " << v1.capacity() << endl;
-----------Output-------------------------
Size of v1 before move = 10
Capacity of v1 before move = 10
Size of v2 after move = 10
Capacity of v2 after move = 10
Size of v1 after move = 0
Capacity of v1 after move = 0
Run Code Online (Sandbox Code Playgroud)
我有两个STL向量A和B,我想清除A的所有元素并将B的所有元素移动到A,然后清除B。
这可以通过组合来完成swap。第一次交换A和B上半场。然后swap空std::vector<>withB或 call clear()。不同的是,clear()不会释放内存,而只会销毁对象:
std::vector<int> a, b; // initialize them somehow
swap(a,b);
// clear b without releasing the memory:
std::size_t capacity = b.capacity();
b.clear();
assert(b.capacity()==capacity);
// or release the memory
std::vector<int>().swap(b);
assert(b.capacity()==0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50616 次 |
| 最近记录: |