C++ STL 的 C 等效项 [重复]

作者:编程家 分类: c++ 时间:2025-05-08

C++ STL的C等效项 [重复]

C++标准模板库(STL)是C++语言中的一个重要组成部分,它提供了一系列通用的数据结构和算法。然而,有些开发者可能更喜欢使用C语言进行编程,或者在某些情况下只能使用C语言。幸运的是,C++ STL的功能在C语言中也有等效的实现。本文将探讨C++ STL中一些常用的功能,并介绍它们在C语言中的等效项。

动态数组

C++ STL提供了一个动态数组的容器类vector。它允许我们在运行时动态地添加和删除元素。在C语言中,我们可以使用指针和动态内存分配来实现类似的功能。下面是一个使用C语言实现动态数组的示例代码:

c

#include

#include

typedef struct {

int* data;

int size;

int capacity;

} DynamicArray;

DynamicArray* createDynamicArray() {

DynamicArray* arr = (DynamicArray*)malloc(sizeof(DynamicArray));

arr->data = (int*)malloc(sizeof(int));

arr->size = 0;

arr->capacity = 1;

return arr;

}

void destroyDynamicArray(DynamicArray* arr) {

free(arr->data);

free(arr);

}

void pushBack(DynamicArray* arr, int element) {

if (arr->size == arr->capacity) {

arr->capacity *= 2;

arr->data = (int*)realloc(arr->data, arr->capacity * sizeof(int));

}

arr->data[arr->size++] = element;

}

int main() {

DynamicArray* arr = createDynamicArray();

pushBack(arr, 1);

pushBack(arr, 2);

pushBack(arr, 3);

for (int i = 0; i < arr->size; i++) {

printf("%d ", arr->data[i]);

}

destroyDynamicArray(arr);

return 0;

}

上述代码使用了一个结构体DynamicArray来模拟C++ STL中的vector类。通过createDynamicArray函数创建一个动态数组,并使用pushBack函数向数组末尾添加元素。最后,我们可以使用循环打印数组中的所有元素,并使用destroyDynamicArray函数释放内存。

链表

C++ STL中的链表容器类list提供了高效的链表操作。在C语言中,我们可以使用指针和结构体来实现类似的链表数据结构。下面是一个使用C语言实现链表的示例代码:

c

#include

#include

typedef struct Node {

int data;

struct Node* next;

} Node;

typedef struct {

Node* head;

int size;

} LinkedList;

LinkedList* createLinkedList() {

LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));

list->head = NULL;

list->size = 0;

return list;

}

void destroyLinkedList(LinkedList* list) {

Node* current = list->head;

while (current != NULL) {

Node* next = current->next;

free(current);

current = next;

}

free(list);

}

void pushFront(LinkedList* list, int element) {

Node* newNode = (Node*)malloc(sizeof(Node));

newNode->data = element;

newNode->next = list->head;

list->head = newNode;

list->size++;

}

void printLinkedList(LinkedList* list) {

Node* current = list->head;

while (current != NULL) {

printf("%d ", current->data);

current = current->next;

}

}

int main() {

LinkedList* list = createLinkedList();

pushFront(list, 3);

pushFront(list, 2);

pushFront(list, 1);

printLinkedList(list);

destroyLinkedList(list);

return 0;

}

上述代码中,我们定义了一个结构体Node表示链表的节点,其中包含数据和指向下一个节点的指针。链表本身由一个结构体LinkedList表示,包含头指针和链表的大小。通过createLinkedList函数创建一个空链表,并使用pushFront函数在链表头部插入元素。最后,我们使用printLinkedList函数打印链表中的所有元素,并使用destroyLinkedList函数释放内存。

堆栈

C++ STL中的堆栈容器类stack提供了后进先出(LIFO)的数据结构。在C语言中,我们可以使用数组和指针来实现堆栈。下面是一个使用C语言实现堆栈的示例代码:

c

#include

#include

#define MAX_SIZE 100

typedef struct {

int data[MAX_SIZE];

int top;

} Stack;

Stack* createStack() {

Stack* stack = (Stack*)malloc(sizeof(Stack));

stack->top = -1;

return stack;

}

void destroyStack(Stack* stack) {

free(stack);

}

void push(Stack* stack, int element) {

if (stack->top == MAX_SIZE - 1) {

printf("Stack Overflow\n");

return;

}

stack->data[++stack->top] = element;

}

int pop(Stack* stack) {

if (stack->top == -1) {

printf("Stack Underflow\n");

return -1;

}

return stack->data[stack->top--];

}

int main() {

Stack* stack = createStack();

push(stack, 1);

push(stack, 2);

push(stack, 3);

while (stack->top != -1) {

printf("%d ", pop(stack));

}

destroyStack(stack);

return 0;

}

上述代码中,我们定义了一个结构体Stack表示堆栈,其中包含一个数组和一个指示栈顶位置的变量。通过createStack函数创建一个空的堆栈,并使用push函数将元素压入堆栈。使用pop函数从堆栈中弹出元素,并使用while循环打印所有弹出的元素。最后,我们使用destroyStack函数释放内存。

队列

C++ STL中的队列容器类queue提供了先进先出(FIFO)的数据结构。在C语言中,我们可以使用数组和指针来实现队列。下面是一个使用C语言实现队列的示例代码:

c

#include

#include

#define MAX_SIZE 100

typedef struct {

int data[MAX_SIZE];

int front;

int rear;

} Queue;

Queue* createQueue() {

Queue* queue = (Queue*)malloc(sizeof(Queue));

queue->front = -1;

queue->rear = -1;

return queue;

}

void destroyQueue(Queue* queue) {

free(queue);

}

void enqueue(Queue* queue, int element) {

if (queue->rear == MAX_SIZE - 1) {

printf("Queue Overflow\n");

return;

}

queue->data[++queue->rear] = element;

if (queue->front == -1) {

queue->front = 0;

}

}

int dequeue(Queue* queue) {

if (queue->front == -1 || queue->front > queue->rear) {

printf("Queue Underflow\n");

return -1;

}

return queue->data[queue->front++];

}

int main() {

Queue* queue = createQueue();

enqueue(queue, 1);

enqueue(queue, 2);

enqueue(queue, 3);

while (queue->front != -1) {

printf("%d ", dequeue(queue));

}

destroyQueue(queue);

return 0;

}

上述代码中,我们定义了一个结构体Queue表示队列,其中包含一个数组和两个指示队列头尾位置的变量。通过createQueue函数创建一个空队列,并使用enqueue函数将元素入队。使用dequeue函数从队列中出队并返回元素,并使用while循环打印所有出队的元素。最后,我们使用destroyQueue函数释放内存。

本文介绍了C++ STL中一些常用的功能在C语言中的等效实现。通过使用指针和动态内存分配,我们可以在C语言中实现类似于C++ STL中的动态数组、链表、堆栈和队列等数据结构。这些等效项可以帮助那些更喜欢使用C语言或只能使用C语言的开发者,以及在某些情况下无法使用C++的项目。在实际编程中,根据项目需求和个人偏好,选择合适的实现方式是很重要的。