10# include <absl/container/inlined_vector.h>
25template<
class T,
size_t N,
class A>
26using VectorBase = absl::InlinedVector<T, N, A>;
28template<
class T,
size_t,
class A>
29using VectorBase = std::vector<T, A>;
38template<
class T,
size_t N = Default_Inlined_Size<T>,
class A = std::allocator<T>>
39class Vector :
public detail::VectorBase<T, N, A> {
41 using Base = detail::VectorBase<T, N, A>;
49 constexpr explicit Vector(
size_t size, F&& f)
noexcept(
50 std::is_nothrow_invocable_r_v<T, F, size_t>&& std::is_nothrow_assignable_v<T&, T>)
51 requires(std::is_invocable_r_v<T, F, size_t>)
53 for (
size_t i = 0; i != size; ++i)
54 (*
this)[i] = std::invoke(f, i);
57 template<std::ranges::forward_range R,
class F>
58 constexpr explicit Vector(R&& range, F&& f)
noexcept(
59 std::is_nothrow_invocable_r_v<T, F,
decltype(*std::ranges::begin(range))>&& std::is_nothrow_assignable_v<T&, T>)
60 requires(std::is_invocable_r_v<T, F,
decltype(*std::ranges::begin(range))>
61 && !std::is_same_v<std::decay_t<R>,
Vector>)
62 :
Base(std::ranges::distance(range)) {
63 auto ri = std::ranges::begin(range);
64 for (
auto& elem : *
this)
65 elem = std::invoke(f, *ri++);
72 template<std::ranges::forward_range R>
74 insert(pos, r.begin(), r.end());
76 template<std::ranges::forward_range R>
84 constexpr auto span() noexcept {
return Span{Base::data(), Base::size()}; }
85 constexpr auto span() const noexcept {
return Span{Base::data(), Base::size()}; }
86 constexpr auto view() const noexcept {
return span(); }
89 friend void swap(
Vector& v1,
Vector& v2)
noexcept(
noexcept(v1.swap(v2))) { v1.swap(v2); }
92static_assert(std::ranges::contiguous_range<Vector<int>>);
96template<class I, class A = std::allocator<typename std::iterator_traits<I>::value_type>>
104template<
class T,
size_t N,
class A,
class U>
106 auto it = std::remove(c.begin(), c.end(), value);
107 auto r = c.end() - it;
108 c.erase(it, c.end());
112template<
class T,
size_t N,
class A,
class Pred>
114 auto it = std::remove_if(c.begin(), c.end(), pred);
115 auto r = c.end() - it;
116 c.erase(it, c.end());
This is a thin wrapper for std::span<T, N> with the following additional features:
This is a thin wrapper for absl::InlinedVector<T, N, A> which is a drop-in replacement for std::vecto...
constexpr auto span() const noexcept
constexpr Vector(R &&range, F &&f) noexcept(std::is_nothrow_invocable_r_v< T, F, decltype(*std::ranges::begin(range))> &&std::is_nothrow_assignable_v< T &, T >)
constexpr auto view() const noexcept
constexpr void append_range(R &&r)
constexpr Vector(size_t size, F &&f) noexcept(std::is_nothrow_invocable_r_v< T, F, size_t > &&std::is_nothrow_assignable_v< T &, T >)
constexpr void insert_range(Base::const_iterator pos, R &&r)
friend void swap(Vector &v1, Vector &v2) noexcept(noexcept(v1.swap(v2)))
detail::VectorBase< T, N, A > Base
constexpr auto span() noexcept
Vector< T, N, A >::size_type erase(Vector< T, N, A > &c, const U &value)
static constexpr size_t Default_Inlined_Size
Use up to 4 words (i.e., 4 * sizeof(size_t)) of inlined storage, rounded up.
Vector< T, N, A >::size_type erase_if(Vector< T, N, A > &c, Pred pred)