1)初始化两个列表A和B.
2)我们指定A = B.此操作的时间复杂度为O(1)。
3)我们为B分配一个不会改变A的新列表。
A = [1, 2, 3]
B = [7, 8]
# A contains [1, 2, 3]
# B contains [7, 8]
#------------------------------------
A = B
# A contains [7, 8]
# B contains [7, 8]
# time complexity: O(1)
#------------------------------------
B = [55, 66, 77, 88]
# A still contains [7, 8]
# B now contains [55, 66, 77, 88]
1)初始化两个向量A和B.
2)我们指定A = B.根据en.cppreference.com,此操作的时间复杂度为O(n)。
3)我们为B分配一个不会改变A的新列表。
vector<int> A = {1, 2, 3};
vector<int> B = {7, 8};
// A contains [1, 2, 3]
// B contains [7, 8]
A = B;
// A contains [7, 8]
// B contains [7, 8]
// time complexity: O(n)
B = {55, 66, 77, 88};
// A still contains [7, 8]
// B now contains [55, 66, 77, 88]
我的问题
Python和C ++程序之间的区别在于步骤2)的时间复杂度,我们指定A = B.
有没有办法让C ++中的向量A在O(1)时间内指向向量B?
注意:我对C ++不太熟悉,所以我甚至不知道将A和B视为C ++中向量对象的引用是否有效。
答案 0 :(得分:5)
由于在将B
赋值给A
之后没有使用它(之后直接分配给它),你可以利用C ++ 11移动语义:
vector<int> A = {1, 2, 3};
vector<int> B = {7, 8};
A = std::move(B);
// O(1), see below
// B is in indeterminate but usable state now (probably empty).
B = {55, 66, 77, 88};
// A still contains [7, 8]
// B now contains [55, 66, 77, 88]
移动赋值运算符的时间复杂度为:
常量,除非
std::allocator_traits<allocator_type>::propagate_on_container_move_assignment()
是false
并且分配器不相等(在这种情况下) 线性)。