2016-10-21 5 views
0

C++リファレンス・ウェブサイト http://www.cplusplus.com/reference/vector/vector/swap/ std :: vectorのスワップ機能の複雑さは一定であると言います。私はそれがベクトルの内容への参照を変更することによってこれをアーカイブすることができると思いますが、1つのstd :: vectorオブジェクトがスタックにあり、もう1つがヒープにある場合、内容を参照することによってこれをアーカイブすることはできませんベクター。だから、ベクトルのスワップ関数の複雑さは常にO(1)です、アーカイブはどのようにこれは、1つのstd :: vectorオブジェクトがスタックにあり、もう1つがヒープにあるのでしょうか?1つのstd :: vectorオブジェクトがスタックにあり、もう1つがヒープにある場合、vectorのスワップ関数の時間複雑さはO(1)かO(n)か?

答えて

2

ベクトルの実際の内容は、ほぼ常にヒープ上にあります。また、参照

1

は言う:同じタイプの

別のベクター容器は、その内容 このコンテナのものと交換されている(すなわち、 同じテンプレートパラメータ、TとのAllocでインスタンス化)。

あなたが見ることができるように、両方のベクトルのアロケータは同じでなければなりません。つまり、実際のデータはデフォルトでヒープ上に配置されます。

あなたは(通常はより正確である)cpprefence documentationに見れば、それは言う:

の場合はstd :: allocator_traits :: propagate_on_container_swap ::値 がtrueの場合、アロケータは使用して交換されています非会員スワップへの非正規化コール それ以外の場合は、スワップされません( get_allocator()!= other.get_allocator()、動作は未定義です)。

したがって、スワップ可能な場合は、異なるアロケータでベクトルをスワップすることもできます。とにかく、スワップは、データがベクトルオブジェクト自体には格納されず、アロケータによって作成および管理されるメモリ内に格納されるため、一定の操作になります。

関連する問題