c++におけるvectorのコピー構築プロセス

3282 ワード

c++中std::vectorのコピー構築プロセス
文章はアリ校が募集した面接問題から来て、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に含まれる場合:
  • コンストラクタ呼び出し回数n n回
  • コピーコンストラクタ呼び出し回数は
  • m m = 1+2+4+⋯+2⌊log(n−1)⌋+n 1 + 2 + 4 + ⋯ + 2 ⌊ log ⁡ ( n − 1 ) ⌋ + n

  • 解析関数呼び出し回数:n+mn+m回