2015年5月25日月曜日

emplace_back(C++11)

emplace_backはvectorの要素の追加を効率的に行えるようにC++11から追加された。

暗黙的型変換を利用して emplace_back により値をコンテナに格納するとコピーコンストラクタが呼ばれない。その分効率的に処理することが可能だ。ただし、暗黙的型変換を利用せず、自ら引数のオブジェクトのコンストラクタを呼び出すとコピーコンストラクタが呼ばれるので注意。
//
// emplacement.cpp
// CplusplusPractice
//
// Created by masai on 2015/05/25.
// Copyright (c) 2015年 masai. All rights reserved.
//
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
A(int i){
cout << "constructor" << endl;
}
A(const A& a){
cout << "copy constructor" << endl;
}
~A(){
cout << "descructor" << endl;
}
};
int main(int argc, char* argv[]){
cout << "push_back ---" << endl;
vector<A> vec;
vec.push_back(0);
vec.clear();
cout << "emplace_back ---" <<endl;
vector<A> vec_e;
vec_e.emplace_back(0);
vec_e.clear();
cout << "emplace_back 非暗黙的変換 ---" <<endl;
vector<A> vec_en;
vec_en.emplace_back(A(0));
vec_en.clear();
cout << "emplace_back 事前確保 ---" <<endl;
// 事前確保
vector<A> vec_r;
vec_r.reserve(3);
vec_r.emplace_back(1);
vec_r.emplace_back(2);
vec_r.emplace_back(3);
vec_r.clear();
// vectorのvector
vector<vector<float>> vec_vec;
// vectorに3つの要素を初期値5でいれる
vec_vec.emplace_back(3, 5);
// vec_vecには1つのベクトルが入る
cout << vec_vec.size() << endl;
// vec_vec.backはvec_vec[0]と同じ
cout << vec_vec.back().size() << endl;
// ベクターには3つの要素
cout << vec_vec[0].size() << endl;
// 5で初期化
cout << vec_vec[0][0] << endl;
}
view raw emplacement.cpp hosted with ❤ by GitHub

0 件のコメント:

コメントを投稿