Note that there are some explanatory texts on larger screens.

plurals
  1. POA good C equivalent of STL vector?
    primarykey
    data
    text
    <p>I've noticed that at several places in our code base we use dynamically expanding arrays, i.e. a base array coupled with an element counter and a "max elements" value. </p> <p>What I want to do is replace these with a common data structure and utility functions, for the usual object-oriented reasons. The array elements can be either basic data types or structs, I need fast random access to the elements, and preferably a type-safe implementation. </p> <p>So, basically, what I would like to use is an STL vector, but the code base is restricted to C89 so I have to come up with something else :-)</p> <p>I gave it some thought and whipped up this initial draft, just to show what I'm aiming at:</p> <pre><code>/* Type-safe dynamic list in C89 */ #define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t #define list(type) type##_list_t #define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size } #define list_free(list) free(list.base_array) #define list_set(list, place, element) if ( list.elements &lt; list.max_size ) { list.base_array[place] = element; } else { /* Array index out of bounds */ } #define list_add(list, element) if ( list.elements &lt; list.max_size ) { list.base_array[list.elements++] = element; } else { /* Expand array then add */ } #define list_get(list, n) list.base_array[n] /* Sample usage: */ list_declare(int); int main(void) { list(int) integers = list_new(int, 10); printf("list[0] = %d\n", list_get(integers, 0)); list_add(integers, 4); printf("list[0] = %d\n", list_get(integers, 0)); list_set(integers, 0, 3); printf("list[0] = %d\n", list_get(integers, 0)); list_free(integers); return EXIT_SUCCESS; } </code></pre> <p>...however, there must be someone else who has done this before. I'm aware of the FreeBSD sys/queue.h implementation of a similar concept for some different queues, but I can't find anything like that for arrays. </p> <p>Is anyone here any wiser?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload