assign() はサイズ指定型、イテレータ型、initializer_list型の3種類あります。いずれも、前回定義した代入演算子と似た造りになります。
template <typename T> class myvector { ... /** * @brief Replaces the contents with count copies of value. * @param[in] count: The new size of the container. * @param[in] value: The value to initialize elements of the container with. * @throw std::length_error: If count is greater than max_size(). * @throw std::bad_alloc: If malloc() (or realloc()) fails to allocate storage. */ void assign(size_type count, const value_type& value) { size_type new_size = length_check(count); // clear for (size_type i = 0; i < size_; i++) { heap_[i].~value_type(); } size_ = 0; // re-allocate if needed if (new_size > capacity_) { reallocation(new_size, realloc_switcher()); } // assign pointer p = heap_; for (size_type i = 0; i < new_size; i++) { new(p++) value_type(value); } size_ = new_size; } /** * @brief Replaces the contents with copies of those in the range [first, last). * @param[in] first: The first of the range to copy the elements from. * @param[in] last: The last of the range to copy the elements from. * @throw std::length_error: If distance between first and last is greater than max_size(). * @throw std::bad_alloc: If malloc() (or realloc()) fails to allocate storage. * @tparam InputIt: Iterator to the elements. */ template <class InputIt> void assign(InputIt first, typename std::enable_if<not std::is_integral<InputIt>::value, InputIt>::type last) { // Switcher for mydistance(). Whether InputIt is random access iterator or input iterator. using iterator_type = typename std::iterator_traits<InputIt>::iterator_category; size_type new_size = length_check(mydistance(first, last, iterator_type())); // clear for (size_type i = 0; i < size_; i++) { heap_[i].~value_type(); } size_ = 0; // re-allocate if needed if (new_size > capacity_) { reallocation(new_size, realloc_switcher()); } // assign pointer p = heap_; for (InputIt i = first; i != last; ++i) { new(p++) value_type(*i); } size_ = new_size; } /** * @brief Replaces the contents with the elements from the initializer list ilist. * @param[in] ilist: Initializer list to copy the values from. * @throw std::length_error: If ilist size is greater than max_size(). * @throw std::bad_alloc: If malloc() (or realloc()) fails to allocate storage. */ void assign(std::initializer_list<value_type> ilist) { size_type new_size = length_check(ilist.size()); // clear for (size_type i = 0; i < size_; i++) { heap_[i].~value_type(); } size_ = 0; // re-allocate if needed if (new_size > capacity_) { reallocation(new_size, realloc_switcher()); } // assign pointer p = heap_; for (const auto& i: ilist) { new(p++) value_type(i); } size_ = new_size; } ... };どの assign() も、①clear()相当の処理、②必要なら領域拡張、③コピーコンストラクタでコピー、という処理を行います。
全ソースコード: https://github.com/suomesta/myvector/tree/master/018
0 件のコメント:
コメントを投稿