This package provides single-header C++20 library that defines container with std::vector interface, which uses statically_allocated storage instead of std::allocator.
The easiest way is to use built-in CMake FetchContent:
include(FetchContent)
FetchContent_Declare(
ecpp_static_vector
GIT_REPOSITORY https://github.com/jmacheta/static_vector.git
GIT_TAG main
)
FetchContent_MakeAvailable(ecpp_static_vector)
Then add a dependency to your target:
target_link_libraries(my_target PUBLIC ecpp_static_vector)
The API of the component is compatible with std::vector one. I tried to implement every method in a meaningful way. The main difference is a class declaration - You need to provide vector's capacity that will be built into it:
#include <ecpp/static_vector>
ecpp::static_vector<int, 20> vec; // Creates static_vector with capacity to store 20 elements of type int
Now you can use it as you would use a std::vector. Please note that in order to avoid UB/throwing, you should check the size before each emplace/insertion:
if(vec.size() < vec.capacity()) {
vec.push_back(42);
} else {
// Well... do anything but insertion ;)
}
If you are not sure, whether you need statically allocated storage, you can create a type alias to switch between static_vector and std::vector as you will:
inline constexpr std::size_t use_dynamic_storage{std::numeric_limits<std::size_t>::max()}; ///< Token to force dynamically allocated storage, instead of static one
/**
* @brief vector type that may use either statically, or dynamically allocated storage
*
* @tparam T value type
* @tparam capacity Storage capacity (static_vector). When use_dynamic_storage is passed, changes to std::vector with dynamic allocation
*/
template<class T, std::size_t capacity> class maybe_static_vector : public std::type_identity<static_vector<T, capacity>> {};
template<class T> class maybe_static_vector<T, use_dynamic_storage> : public std::type_identity<std::vector<T>> {};
template<class T, std::size_t capacity> using maybe_static_vector_t = typename maybe_static_vector<T, capacity>::type;
- Non-member functions are NOT defined in namespace std. If you need them, use using namespace.
- reserve method is a NO-OP (unless you exceed capacity - then it throws)
- shrink_to_fit is a NO-OP