c++におけるvectorのコピー構築プロセス
3282 ワード
c++中std::vectorのコピー構築プロセス
文章はアリ校が募集した面接問題から来て、vectorの中でpush nのオブジェクトに、オブジェクトの構造関数を聞いて、構造関数をコピーして、構造関数を分析してそれぞれ何回呼び出しましたか?
vectorでのメモリ割り当てポリシー
vectorの下部は動的配列で格納されており、
コピー構築プロセス
まず簡単な分析過程を構築する.
簡単にするために、pushは5つの要素しかありません.実行結果を見て簡単に分析します.
最初に挿入するとき、容量は0:まずオブジェクトを構築し、値は0、配列容量は1になり、次に構造をコピーし、動的配列の要素をコピーします.2回目の挿入時,容量は1:まずオブジェクトを構築し,値は1であり,配列長が足りないことを発見し,配列を元の2倍に拡大し,その後構造1と元の0をコピーする.3回目の挿入時,容量は2:まずオブジェクトを構築し,値は2であり,配列長が足りないことを発見し,配列を元の2倍に拡大し,その後構造2と元の0,1をコピーする.4回目の挿入時、容量は4:まずオブジェクトを構築し、値は3で、配列が新しい要素を収容できることを発見し、直接構造3から配列5回目の挿入時、容量は4:まずオブジェクトを構築し、値は4で、配列の長さが足りないことを発見し、すべてが元の2倍に拡大し、それから構造4と元の0、1、2、3をコピーします.
結論分析
以上の解析から,コンストラクション関数が発生するたびに必ずコピー構造が伴って配列に入れられ,余分なコピー過程は配列長が足りないときに発生し,配列を拡大するたびに前の要素を1回コピーし,配列を拡大するときも,配列が2 n+12 n+1の要素に挿入されるときであることが容易に分かった.前の2 n 2 n個の要素を一度コピーする必要があります.したがってpush n要素がvectorに含まれる場合:コンストラクタ呼び出し回数n n回 コピーコンストラクタ呼び出し回数は m m = 1+2+4+⋯+2⌊log(n−1)⌋+n 1 + 2 + 4 + ⋯ + 2 ⌊ log ( n − 1 ) ⌋ + n
解析関数呼び出し回数:n+mn+m回
文章はアリ校が募集した面接問題から来て、vectorの中でpush nのオブジェクトに、オブジェクトの構造関数を聞いて、構造関数をコピーして、構造関数を分析してそれぞれ何回呼び出しましたか?
vectorでのメモリ割り当てポリシー
vectorの下部は動的配列で格納されており、
vector vect
という形で宣言すると配列の長さは0であり、最初の要素を挿入すると配列の長さは1になり、2番目を挿入すると配列の長さは2になり、3番目の要素を挿入すると配列の長さは4になり、3番目を挿入すると配列の長さは4になり、4番目の要素の場合、配列の長さは変わりません.5番目の要素を挿入すると、配列の長さは8になります.これにより、配列の長さの割り当てポリシーが表示されます.配列の長さが新しい要素を収容できない場合、配列の長さは元の2倍になります.(vect.capacity()
が使用可能)コピー構築プロセス
まず簡単な分析過程を構築する.
#include
#include
#include
using namespace std;
int num = 0;
class Node{
public:
int a;
Node(int a){
this->a = a;
cout<<this<<" "<<" "<const Node & node){
num++;
this->a = node.a;
cout<<this<""<<コピーコンストラクタ"<cout<<this<""<< "<int main(){
// freopen("in.txt", "w", stdout);
vector vect;
for (int i = 0; i<5; i++){
vect.push_back(Node(i));
}
cout<
簡単にするために、pushは5つの要素しかありません.実行結果を見て簡単に分析します.
0x70fe30 0
0x151540 0
0x70fe30 0
0x70fe30 1
0x151a14 1
0x151a10 0
0x151540 0
0x70fe30 1
0x70fe30 2
0x151548 2
0x151540 0
0x151544 1
0x151a10 0
0x151a14 1
0x70fe30 2
0x70fe30 3
0x15154c 3
0x70fe30 3
0x70fe30 4
0x151a20 4
0x151a10 0
0x151a14 1
0x151a18 2
0x151a1c 3
0x151540 0
0x151544 1
0x151548 2
0x15154c 3
0x70fe30 4
12
0x151a10 0
0x151a14 1
0x151a18 2
0x151a1c 3
0x151a20 4
最初に挿入するとき、容量は0:まずオブジェクトを構築し、値は0、配列容量は1になり、次に構造をコピーし、動的配列の要素をコピーします.2回目の挿入時,容量は1:まずオブジェクトを構築し,値は1であり,配列長が足りないことを発見し,配列を元の2倍に拡大し,その後構造1と元の0をコピーする.3回目の挿入時,容量は2:まずオブジェクトを構築し,値は2であり,配列長が足りないことを発見し,配列を元の2倍に拡大し,その後構造2と元の0,1をコピーする.4回目の挿入時、容量は4:まずオブジェクトを構築し、値は3で、配列が新しい要素を収容できることを発見し、直接構造3から配列5回目の挿入時、容量は4:まずオブジェクトを構築し、値は4で、配列の長さが足りないことを発見し、すべてが元の2倍に拡大し、それから構造4と元の0、1、2、3をコピーします.
結論分析
以上の解析から,コンストラクション関数が発生するたびに必ずコピー構造が伴って配列に入れられ,余分なコピー過程は配列長が足りないときに発生し,配列を拡大するたびに前の要素を1回コピーし,配列を拡大するときも,配列が2 n+12 n+1の要素に挿入されるときであることが容易に分かった.前の2 n 2 n個の要素を一度コピーする必要があります.したがってpush n要素がvectorに含まれる場合: