# 27 Algorithms library [algorithms]

## 27.11 Specialized <memory> algorithms [specialized.algorithms]

### 27.11.9destroy[specialized.destroy]

```template<class T> constexpr void destroy_at(T* location); namespace ranges { template<destructible T> constexpr void destroy_at(T* location) noexcept; } ```
Effects:
• If T is an array type, equivalent to destroy(begin(*location), end(*location)).
• Otherwise, equivalent to location->~T().
```template<class NoThrowForwardIterator> constexpr void destroy(NoThrowForwardIterator first, NoThrowForwardIterator last); ```
Effects: Equivalent to: for (; first != last; ++first) destroy_at(addressof(*first));
```namespace ranges { template<nothrow-input-iterator I, nothrow-sentinel-for<I> S> requires destructible<iter_value_t<I>> constexpr I destroy(I first, S last) noexcept; template<nothrow-input-range R> requires destructible<range_value_t<R>> constexpr borrowed_iterator_t<R> destroy(R&& r) noexcept; } ```
Effects: Equivalent to: for (; first != last; ++first) destroy_at(addressof(*first)); return first;
```template<class NoThrowForwardIterator, class Size> constexpr NoThrowForwardIterator destroy_n(NoThrowForwardIterator first, Size n); ```
Effects: Equivalent to: for (; n > 0; (void)++first, --n) destroy_at(addressof(*first)); return first;
```namespace ranges { template<nothrow-input-iterator I> requires destructible<iter_value_t<I>> constexpr I destroy_n(I first, iter_difference_t<I> n) noexcept; } ```
Effects: Equivalent to: return destroy(counted_iterator(std::move(first), n), default_sentinel).base();