emplace_back() と push_back() の関係は、emplace() と insert() の関係とほぼ同じです。
template <typename T>
class myvector
{
...
/**
* @brief Appends a new element to the end of the container. The arguments
* args... are forwarded to the constructor as std::forward<Args>(args)....
* If the new size() is greater than capacity() then all iterators
* and references (including the past-the-end iterator) are invalidated.
* Otherwise only the past-the-end iterator is invalidated.
* @param[in] args: Arguments to forward to the constructor of the element.
* @tparam Args: Parameter pack for constructor's arguments.
* @return A reference to the inserted element.
*/
template <class... Args>
reference emplace_back(Args&&... args)
{
if (need_twice_capacity()) {
reallocation(twice_length(), realloc_switcher());
}
new(&heap_[size_]) value_type(std::forward<Args&&>(args)...);
size_++;
return heap_[size_ - 1];
}
...
};
push_back() とほぼ同じ処理です。違いは、placement-new する時に、引数をコンストラクタのパラメータとして渡す点です。
全ソースコード: https://github.com/suomesta/myvector/tree/master/029
0 件のコメント:
コメントを投稿