とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

コピーの様子を見る std::vector

STL―標準テンプレートライブラリによるC++プログラミング 第2版

// P129 ex06-03.cpp
struct U{
 unsigned long id, generation;
 static unsigned long totalCopies;
 U(): id(), generation(){}
 U(unsigned long x): id(x), generation(){}
 U(const U& z): id(z.id), generation(z.generation + 1){
  ++totalCopies;
 }
};
unsigned long U::totalCopies = 0;
bool operator==(const U& x, const U& y){return x.id == y.id;}
bool operator!=(const U& x, const U& y){return x.id != y.id;}

#include<iostream>
#include<vector>
#include<cassert>
int main(){
 using std::cout;
 using std::endl;
 using std::vector;
 cout << "Demonstrating STL vector constructors with "
  "a user-defined type and showing copying explicitly." << endl;
 vector<U> v1, v2(3);
 assert(v1.size() == 0);
 assert(v2.size() == 3);
 assert(v2[0] == U() && v2[1] == U() && v2[2] == U());
 for(int i = 0; i != 3; ++i)
  cout << "v2[" << i << "].generation: " << v2[i].generation << endl;
 cout << "Total copies: " << U::totalCopies << endl;
}

出力:

Demonstrating STL vector constructors with a user-defined type and showing copying explicitly.
v2[0].generation: 1
v2[1].generation: 1
v2[2].generation: 1
Total copies: 3