This repository contains a custom implementation of a vector class in C++. This class is designed to demonstrate dynamic array management principles and includes a variety of features and methods. The implementation also includes performance benchmarks comparing it to std::vector.
-
Default Constructor: Initializes with a default capacity of 10 elements. Allocates memory for the initial capacity to avoid frequent reallocations.
-
Iterator-Based Constructor: Initializes the vector based on the provided range of iterators. Uses
std::distanceto determine the required capacity and callspushBackInternal()for each element in the range. -
Aggregate Initialization Constructor: Initializes the vector from an initializer list by delegating to the Iterator-Based Constructor.
-
Copy Constructor: Creates a new vector as a copy of an existing vector. Uses try-catch blocks to handle errors during copying and ensures correct exception safety.
-
Move Constructor: Transfers ownership from a temporary vector to the new vector. Uses the
swap()method to exchange contents, effectively resetting the moved vector.
-
Element Access:
T& at(size_t index): Validated access to an element at a specified index.const T& at(size_t index) const: Const validated access.T& operator[](size_t index): Non-validated access.const T& operator[](size_t index) const: Const non-validated access.T& front(): Access the first element.const T& front() const: Const access to the first element.T& back(): Access the last element.const T& back() const: Const access to the last element.
-
Size and Capacity:
size_t VectorSize() const: Returns the current number of elements.bool empty() const: Checks if the vector is empty.size_t Capacity(): Returns the current capacity.
-
Assignment Operators:
Vector operator=(Vector&& MoveVector): Move assignment operator.Vector& operator=(Vector const& copy): Copy assignment operator.bool operator==(Vector const& rhs) const: Equality comparison operator.
-
Iterators:
T* begin(): Returns an iterator to the beginning.const T* begin() const: Const iterator to the beginning.T* end(): Returns an iterator to the end.const T* end() const: Const iterator to the end.
-
Push Back:
void push_back(size_t const& value): Adds an element to the end of the vector, resizing if necessary.void push_back(size_t&& value): Overloaded for Rvalue values to move elements.
-
Pop Back:
void pop_back(): Removes the last element and calls its destructor.
-
Swap:
void swap(Vector& SwapVector): Exchanges contents with another vector.
-
Reserve Capacity:
void reserve(size_t cappacityHigh): Reserves a specified amount of memory to accommodate future elements.
~Vector(): Releases allocated memory using a custom deleter and ensures proper cleanup.
- Simple Copy:
- Uses SFINAE (Substitution Failure Is Not An Error) to optimize copying and moving operations based on whether the type
Tis noexcept-move-constructible or trivially destructible.
- Uses SFINAE (Substitution Failure Is Not An Error) to optimize copying and moving operations based on whether the type
void STLVectorBenchmark()
{
using vector = std::vector<int>;
clock_t start, end;
start = clock();
vector VectorTest;
for (int i = 0; i < 50000000; i++)
{
VectorTest.push_back(rand() % 10);
}
end = clock();
printf("Vector From STL: %lg seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
}void CustomVectorBenchmark()
{
using Vector = Vector<int>;
clock_t start, end;
start = clock();
Vector VectorTest;
for (int i = 0; i < 50000000; i++)
{
VectorTest.push_back(rand() % 10);
}
end = clock();
printf("Custom Vector: %lg seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
}Future updates will include:
- Insert: Method to insert elements at a specific position.
- Emplace: Method to construct and insert elements in-place.
- Assign: Method to assign new values to the vector.
- Reverse Iterator: Support for reverse iteration over the vector.
- Clone the Repository:
git clone https://github.com/yourusername/custom-vector- Build the Project:
- Use your preferred C++ build system to compile the project.
- Run Benchmarks:
- Execute the main program to compare performance between std::vector and the custom vector implementation.
This project is open source and available under the MIT License.