STL源代码分析(ch2 内存分配)uninitialized_fill

1. uninitialized_fill(ForwardIter first, ForwardIter last, const T& value)

// uninitialized_fill
// 在 [first, last) 区间内填充元素值
template <class ForwardIter, class T>
void  uninitialized_fill(ForwardIter first, ForwardIter last, const T& value)
{
    
    
  mystl::unchecked_uninit_fill(first, last, value, 
                               std::is_trivially_copy_assignable<
                               typename iterator_traits<ForwardIter>::
                               value_type>{
    
    });
}

->

template <class ForwardIter, class T>
void 
unchecked_uninit_fill(ForwardIter first, ForwardIter last, const T& value, std::true_type)
{
    
    
  mystl::fill(first, last, value);
}

template <class ForwardIter, class T> void 
unchecked_uninit_fill(ForwardIter first, ForwardIter last, const T& value, std::false_type)
{
    
    
  auto cur = first;
  try
  {
    
    
    for (; cur != last; ++cur)
    {
    
    
      mystl::construct(&*cur, value);
    }
  }
  catch (...)
  {
    
    
    for (;first != cur; ++first)
      mystl::destroy(&*first);
  }
}

1.1 fill

// fill
// 为 [first, last)区间内的所有元素填充新值
template <class ForwardIter, class T>
void fill(ForwardIter first, ForwardIter last, const T& value)
{
    
    
  fill_cat(first, last, value, iterator_category(first));
}

->

template <class ForwardIter, class T>
void fill_cat(ForwardIter first, ForwardIter last, const T& value,
              mystl::forward_iterator_tag)
{
    
    
  for (; first != last; ++first)
  {
    
    
    *first = value;
  }
}

template <class RandomIter, class T>
void fill_cat(RandomIter first, RandomIter last, const T& value,
              mystl::random_access_iterator_tag)
{
    
    
  fill_n(first, last - first, value);
}

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/123911918