C语言如何删除向量中的元素

时间:2015-03-26 10:54:19

标签: c vector

我使用了矢量 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);
}

从上面的代码中,没有删除功能。 如果我想删除矢量对象中的这样一个元素,我怎么能实现呢?

2 个答案:

答案 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),它将你在内存中“向后”删除的元素之后的所有元素移动一个位置。总而言之,因为您提出这样的问题:如果您经常需要删除元素,则选择了错误的容器。