1)2つのリストAとBが初期化されます。
2)A = Bを割り当てます。この操作の時間計算量はO(1)です。
3)Aを変更しない新しいリストをBに割り当てます。
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)2つのベクトルAとBが初期化されます。
2)A = Bを割り当てます。en.cppreference.comによると、この操作の時間計算量はO(n)です。
3)Aを変更しない新しいリストをBに割り当てます。
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 ++プログラムの違いは、A = Bを割り当てるステップ2)の時間計算量です。
C ++のベクトルAがO(1)時間のベクトルBを指すようにする方法はありますか?
注:私はC ++にあまり詳しくないため、AとBをC ++のベクターオブジェクトへの参照と見なすことが有効かどうかさえわかりません。
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()
isfalse
でない限り定数であり、アロケータは等しく比較されません(この場合は線形)。
ソース。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加