emplace() は insert() とほとんど同じ動作になります。
template <typename T>
class myvector
{
...
/**
* @brief Inserts a new element into the container directly before pos.
* The arguments args... are forwarded to the constructor as
* std::forward<Args>(args)....
* If the new size() is greater than capacity(), all iterators and
* references are invalidated. Otherwise, only the iterators and
* references before the insertion point remain valid. The past-the-end
* iterator is also invalidated.
* @param[in] pos: Iterator before which the new element will be constructed. pos
* may be the end() iterator.
* @param[in] args: Arguments to forward to the constructor of the element.
* @tparam Args: Parameter pack for constructor's arguments.
* @return Iterator pointing to the inserted value.
*/
template <class... Args>
iterator emplace(const_iterator pos, Args&&... args)
{
// calculate distance
size_type distance = mydistance(static_cast<const_iterator>(&heap_[0]), pos, std::random_access_iterator_tag());
// re-allocate if needed
if (need_twice_capacity()) {
reallocation(twice_length(), realloc_switcher());
}
// slide elements after pos
incremental_slide(distance, 1, slide_switcher());
// set inserted element
new(&heap_[distance]) value_type(std::forward<Args&&>(args)...);
size_++;
return static_cast<iterator>(&heap_[distance]);
}
...
};
①挿入後のサイズ計算、②領域確保、③既存要素の移動、④新要素の代入、という処理の流れになるのは、insert() と同じです。新要素の作成には、C++11 の新文法であるコンストラクタ引数列を使用します。
全ソースコード: https://github.com/suomesta/myvector/tree/master/027
0 件のコメント:
コメントを投稿