You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Generic & Typesafe Vector/List implementation in C (~150 LOC).
About
Vector/List is fundamental data structure for just about anything. Almost all programming languages as a builtin or packaged into standard library except for C. Also, it includes Iterator for free which allows you to do pretty interesting stuff such as peek, next, done, etc.
It has a single header file called cvector.h. You can simply copy/paste in your source directory to get started. You can also install via clib (package manager for C).
#include"cvector.h"intmain() {
// Define type that holds vector of intCVector(int) vector_int_t;
// Declare variable of type `vector_int_t`vector_int_tvector_int;
// Initializecvector__init(&vector_int);
// Push number to vectorfor (inti=0; i<100; i++) {
cvector__add(&vector_int, i);
}
// Size of the vectorsize_tsize=cvector__size(&vector_int);
// Iterate over elementsfor (inti=0; i<100; i++) {
intnumber=cvector__index(&vector_int, i);
printf("Number is: %d\n", number);
}
}
With Iterator
#include"cvector.h"// Define zero type of intCVector(int) vector_int_t;
// Define iterator type for iterator_int_tCVector_iterator(vector_int_t) iterator_int_t;
intmain() {
// Declare variable of type `zero_int_t`vector_int_tvector_int;
// Initializecvector__init(&vector_int);
// Push elements to vectorfor (inti=0; i<10; i++) {
cvector__add(&vector_int, i*i);
}
// Declare varaible of type `iterator_int_t`iterator_int_titerator_int;
// Initialize iterator with vector of intcvector_iterator__init(&iterator_int, &vector_int);
// Peek the current elementintnumber=cvector_iterator__peek(&iterator_int);
printf("The peeked number is: %d\n", number);
// Iterate using iteratorfor (;;) {
if (cvector_iterator__done(&iterator_int)) {
break;
}
intnumber=cvector_iterator__next(&iterator_int);
printf("Got number: %d\n", number);
}
}
Using struct
#include"cvector.h"typedefstructNode_t {
intx;
inty;
} Node_t;
intmain() {
// Define vector type of `Node_t`CVector(Node_t) vector_node_t;
// Declare variable of type `vector_node_t`vector_node_tvector_node;
// Initialize vectorcvector__init(&vector_node);
// Push to vectorfor (inti=0; i<100; i++) {
Node_tnode= ((Node_t){.x=i, .y=i*i});
cvector__add(&vector_node, node);
}
// Define iterator of type `vector_node_t`CVector_iterator(vector_node_t) iterator_node_t;
// Declare variable of type `iterator_node_t`iterator_node_titerator_node;
// Initialize iteratorcvector_iterator__init(&iterator_node, &vector_node);
// Iteratefor(;;) {
if (cvector_iterator__done(&iterator_node)) {
break;
}
Node_tnode=cvector_iterator__next(&iterator_node);
printf("Node: x -> %d & y -> %d\n", node.x, node.y);
}
}
More APIs (cvector.h)
#include<cvector.h>intmain() {
CVector(int) vector_int_t;
vector_int_tvector_int;
cvector__init(&vector_int);
cvector__add(&vector_int, 12);
cvector__add(&vector_int, 13);
cvector__add(&vector_int, 14);
cvector__add(&vector_int, 15);
// First
{
// Get the first elementintnumber=cvector__first(&vector_int);
printf("First element: %d\n", number);
}
// Last
{
// Get the last element by referenceint*number=cvector__last_ref(&vector_int);
printf("Last element: %d\n", *number);
}
// Pop
{
size_tsize_before=cvector__size(&vector_int);
printf("Size of vector before pop: %ld\n", size_before);
// Pop element from the vectorintnumber=cvector__pop(&vector_int);
printf("Popped element: %d\n", number);
size_tsize_after=cvector__size(&vector_int);
printf("Size of vector after pop: %ld\n", size_after);
}
// Set value at index
{
if(cvector__set_at_index(&vector_int, 0, 56) ==-1) {
fprintf(stderr, "Failed to set the value '56' at index '0'");
}
}
}