我使用了矢量 link
提供初始化,获取和设置向量的方法,如下面的代码。
// vector.c
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
void vector_init(Vector *vector) {
// initialize size and capacity
vector->size = 0;
vector->capacity = VECTOR_INITIAL_CAPACITY;
// allocate memory for vector->data
vector->data = malloc(sizeof(int) * vector->capacity);
}
void vector_append(Vector *vector, int value) {
// make sure there's room to expand into
vector_double_capacity_if_full(vector);
// append the value and increment vector->size
vector->data[vector->size++] = value;
}
int vector_get(Vector *vector, int index) {
if (index >= vector->size || index < 0) {
printf("Index %d out of bounds for vector of size %d\n", index, vector->size);
exit(1);
}
return vector->data[index];
}
void vector_set(Vector *vector, int index, int value) {
// zero fill the vector up to the desired index
while (index >= vector->size) {
vector_append(vector, 0);
}
void vector_double_capacity_if_full(Vector *vector) {
if (vector->size >= vector->capacity) {
// double vector->capacity and resize the allocated memory accordingly
vector->capacity *= 2;
vector->data = realloc(vector->data, sizeof(int) * vector->capacity);
}
从上面的代码中,没有删除功能。 如果我想删除矢量对象中的这样一个元素,我怎么能实现呢?
答案 0 :(得分:1)
删除向量元素意味着将所有后续元素移回一个位置。
我给你代码删除最后一个元素,只需将其更改为删除特定元素并移动所有元素
void vector_delete_last(Vector *vector) {
if (vector->size) {
vector->size -= 1;
} // else /* error */;
}
或制作vector_swap()
来交换两个元素,然后删除最后一个元素。
答案 1 :(得分:0)
像C++'s standard library这样的常用的向量根本不具备很好的“删除”功能,因为它们依赖于内存中的元素直接一个接一个 - 所以如果删除一个元素从中间开始,所有后续元素都需要重新定位。从上面的链接:
因为矢量使用数组作为其底层存储,所以擦除 在矢量端以外的位置的元素导致容器 将段删除后的所有元素重新定位到新的元素 位置。与此相比,这通常是低效的操作 一个由其他类型的序列执行相同的操作 容器(例如list或forward_list)。
C实现的向量的作者可能没有实现这种低效的操作。你必须编写一个循环(或一个memmove),它将你在内存中“向后”删除的元素之后的所有元素移动一个位置。总而言之,因为您提出这样的问题:如果您经常需要删除元素,则选择了错误的容器。