c - 一个好的 C 等效的 STL vector ?

标签 c c89

我注意到在我们的代码库中的几个地方我们使用动态扩展数组,即一个基本数组加上一个元素计数器和一个“最大元素”值。

出于通常的面向对象的原因,我想做的是用通用数据结构和实用函数替换它们。 数组元素可以是基本数据类型或结构,我需要快速随机访问元素,最好是类型安全的实现。

所以,基本上,我想使用的是一个 STL vector ,但代码库仅限于 C89,所以我必须想出其他办法:-)

我想了想并草拟了这份初稿,只是为了展示我的目标:

/* 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 < list.max_size ) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if ( list.elements < 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;
}

...但是,必须有其他人以前这样做过。我知道 FreeBSD sys/queue.h 实现了一些不同队列的类似概念,但我找不到类似的数组。

这里有人更聪明吗?

最佳答案

glib 提供了一个 GArray类型,它实现了一个动态增长的数组。如果您可以使用外部第 3 方库,glib 作为 C 的“标准”库几乎总是一个不错的选择。它为所有基本数据结构、unicode 字符串、日期和时间值等提供类型。

关于c - 一个好的 C 等效的 STL vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456446/

相关文章:

c++ - 将大小 <= N 的所有连续 0 位组翻转为 1s

java - 获取 ttyS0 : 1 input overrun(s)

c++ - 我找不到 g_io_channel_win32_make_pollfd 的任何文档

c - DBus Glib 发送信号 - 没有发出信号

c - 如何检查目标代码是否为 16/32 位?

c - C 中的 wait()。我应该传递什么参数给它

c - 是否可以连续测试两个换行符?

c - 使用 mikroC for PIC 的 PIC 单片机中基于定时器的中断

c - 将越界索引与从足够大的数组转换而来的较小数组一起使用是否安全?

c - 未声明的标识符虽然已声明