最終更新日時(UTC):
が更新

履歴 編集

function template
<vector>

std::vector::emplace_back(C++11)

template <class... Args>
void emplace_back(Args&&... args);                      // (1) C++11
template <class... Args>
reference emplace_back(Args&&... args);                 // (1) C++17
template <class... Args>
constexpr reference emplace_back(Args&&... args);       // (1) C++20

template <class... Args>
void vector<bool>::emplace_back(Args&&... args);                // (2) C++11
template <class... Args>
reference vector<bool>::emplace_back(Args&&... args);           // (2) C++17
template <class... Args>
constexpr reference vector<bool>::emplace_back(Args&&... args); // (2) C++20

概要

直接構築で新たな要素を末尾に追加する。

この関数の引数 args... は、要素型 value_type のコンストラクタ引数である。当関数の内部で要素型 value_type のコンストラクタを呼び出し、追加する要素を構築する。

戻り値

  • C++14 まで:なし
  • C++17 から:構築した要素への参照

計算量

償却定数時間。

この関数を呼び出す前にsize() < capacity()であった場合、この関数の実行は定数時間で行われる。そうでない場合は、メモリ領域の再確保と、その領域への要素のコピーもしくはムーブが行われるため、線形時間で実行される。

vectorの実装で行われるメモリ確保戦略では、再確保の際にそれら要素がぴったり収まるサイズを確保するのではなく、少し多めの1.5倍や2倍といったサイズのメモリを確保し、再確保の回数を減らしている。事前に追加する要素の数がわかっている場合にはreserve()メンバ関数で事前にその要素数分のメモリを確保し、そうでない場合にはvectorのメモリ確保戦略に任せるのがよいだろう。

備考

  • 再確保の可能性、イテレータの有効性への影響、例外発生時に副作用が発生しない保証はいずれもpush_back()と同様。

#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <algorithm>

int main()
{
  std::vector<std::pair<int, std::string>> v;

  v.emplace_back(3, std::string("hello"));
  v.push_back(std::make_pair(1, std::string("world")));

  std::for_each(v.begin(), v.end(), [](decltype(v)::const_reference x) {
    std::cout << x.first << ',' << x.second << std::endl;
  });
}

出力

3,hello
1,world

バージョン

言語

  • C++11

処理系

参照