欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在C++中,如何移除整个数组或单个数组元素的方法

最编程 2024-02-21 10:07:27
...

在这篇文章中,我们解释了如何在C++中删除一个数组或删除数组中的一个元素。我们涵盖了静态和动态内存分配数组的情况,以及数组的基本知识。

目录:

  1. 阵列的基本原理和不同的操作
  2. C/C++中的Delete()
  3. 删除数组中的一个元素
  4. 在C++中删除静态分配的数组
  5. 在C++中删除动态分配的数组
  6. 删除一个数组的复杂时间

现在我们来探讨一下C++中删除数组的整个过程。

下面是关于删除过程的一些关键点:-

  • 删除一个数组类似于给这个特定的元素分配了未定义。
  • 删除要删除的元素,并将其他元素移到左边以保持所有元素在一起。
  • 如果数组是静态分配的内存,内存不能被删除。当程序终止时,内存被释放。
  • 如果数组是动态分配的内存,额外的内存可以通过使用realloc来删除。
  • 删除一个元素的时间复杂度是O(N)时间。

让我们开始讨论什么是数组,什么是数组的类型以及数组的声明过程。

阵列的基础和不同的操作

数组的介绍

一个数组是一组相关的数据类型,它们用共同的名字来调用,并且都具有相同的类型和大小。一个数组是一个类似数据类型的元素的集合。这个集合是有限的,元素被存储在相邻的内存位置。

  • 数组声明的语法是:-
    数据类型 array_name[size_of_array]。

表示顺序 :-
1.行为主的顺序- 数组的行为主的表示顺序是指元素以行的方式存储在数组中的顺序。

2.2.列主要顺序- 数组的列主要顺序是指元素以列的方式存储在数组中。

阵列的声明

数组变量的声明与它们的数据类型的变量相同,只是变量的名字后面有一对方括号[ ],代表数组的每个维度。未初始化的数组必须在方括号内列出其行和列的尺寸。
在C语言中声明数组时使用的尺寸必须是正积分常数或常数表达式。

我们可以用不同的方法来声明一个数组。可以通过指定它的类型和大小,或者通过初始化它,或者两者同时进行。

  1. 通过指定大小的数组声明

    int arr1[10]
    

    我们可以声明一个用户指定大小的数组

    int arr2[n]
    
  2. 通过初始化元素进行数组声明

    int arr[] = {10, 20, 30, 40}
    

    编译器创建了一个大小为4的数组

  3. 通过指定大小和初始化元素进行数组声明

    int arr[6] = {10, 20, 30, 40,}
    

    编译器创建了一个大小为6的数组,初始化了用户指定的前4个元素,其余元素为{0,0}。

数组的类型:-

数组可以有以下类型:-

  1. 静态或(一维)数组。
  2. 动态数组或(2D-3D)数组。
  • 静态数组
    静态数组是最常用的数组形式。它是一种大小不能改变的数组类型。静态数组在堆栈中存储它们的值,它们的大小必须在编译时知道。
    它有一个局部范围。因此,它只能在声明它的块中使用。如果静态数组没有被特别初始化,它的元素会被初始化为默认值,对于任何算术类型(int, float, char),默认值为0,对于指针,默认值为NULL。静态数组在程序执行结束前都有其寿命。因此,在一个函数中定义的静态数组在控制权离开该函数时不会被破坏,该数组的值在下次调用该函数时也适用。

  • 动态数组
    动态数组是一个有巨大改进的数组:自动调整大小。数组的一个障碍是它们是固定大小的。这意味着你需要提前指定你的数组所能容纳的元素数量。一个动态数组会随着我们在其中添加更多的元素而扩展。
    当我们指定一个动态数组时,动态数组的实现会产生一个固定大小的元素数组。由于未使用的内存适用于堆,所以每当运行时提供内存时,都会使用堆数据结构来指定,因为它是*内存空间的池。在C++中,我们有一个操作符,叫做new,它的返回地址指定在堆中的变量上。

基本操作:-

以下是数组支持的基本操作。

  • 遍历
    对数组中的每个元素精确处理一次的方法被称为遍历,整个操作被称为遍历。
    在数组中,遍历操作从数组的第一个元素开始,到数组的最后一个元素结束。
    算法:-
    第1步。 [初始化] 设置l = LB。
    第2步。重复步骤3和4,同时l<=UB。
    第3步。 [处理]处理A[l]元素。
    第4步。 [增加计数器]l=l+1 [
    结束步骤2的循环]
    这里,l是计数器变量UB
    - Upper Bond,LB - Lower Bond,A[]是线性阵列。

  • 插入
    插入操作是将一个或多个数据元素插入到一个数组中。根据我们的要求,一个新的元素可以被添加到数组的起始端或任何给定的索引。
    假设数组中有N个元素,我们想在第一个和第二个元素之间插入一个新元素。我们必须将最后一个N-1元素向下移动,以便为新元素创造空间。
    算法
    第1步。 [初始化]设置l=N
    第2步。[循环]重复步骤3和步骤4,而l>=P
    第3步。 [向下移动第1个元素]设A[l+1] = A[l]
    第4步。 [减少计数器]设l=l-1 [
    循环结束]
    第5步。[插入元素]设A[P]=X
    第6步。设置N=N+1
    第7步 退出
    这里,P是位置;N是元素的数量;A[]是数组

  • 删除
    这个操作用于从一维数组中的特定位置删除一个元素。
    为了从数组中删除一个元素,我们必须从特定位置删除一个元素,然后将剩余的元素向上移动,以占据被删除元素的空位。
    算法;-
    第1步。 [初始化]设X=A[P]
    第2步。[循环]重复l=P到N-1
    第3步。 [向上移动l+1个元素]设A[P]=X
    [循环结束]
    第4步。 [重置数字N]设N=N-1
    第5步。 退出

  • 搜索
    搜索操作是用来找出元素的位置,如果它存在于给定的数据元素集合中。
    假设数组中要搜索的元素是X,那么我们必须从头开始,并且必须将X与每个元素进行比较。这个操作将持续进行,直到找到元素或数组结束。
    算法:-
    步骤1.
    SREP 2.
    S

  • 更新
    更新操作是指在给定的索引处更新数组中的一个现有元素。
    基本上,更新操作是在我们想要更新数组中的任何元素时使用。假设我们想更新数组列表中的现有元素,那么在更新操作的帮助下,我们可以很容易地更新列表中现有元素的新值。

C/C++中的Delete()

Delete是一个操作符,用于蹂躏由new语句生成的数组和非数组(指针)对象。C语言使用malloc()和calloc()函数在运行时动态地指定内存,并使用free()函数释放动态分配的内存。

C++支持这些功能,也有一些操作符new和delete,以更好、更容易的方式执行指定和释放内存的任务。

问题

什么是删除操作符?

删除一个内存块

删除整个程序的内存

只分配原始数据内存

删除为一个类保留的所有数据。

解释。删除操作符是新建操作符的反向过程。它取消了为一个对象分配的所有内存。该对象可以是任何类型的。删除操作符完全销毁了一个对象,这样资源就可以用于其他目的。

删除数组中的一个元素

从数组中删除元素的详细逻辑步骤:-

  • 移动到你想在给定数组中删除的位置。
  • 将下一个元素复制到数组的当前元素,也就是你需要执行array[i] = array[i + 1]。
  • 重复以上步骤,直到你到达数组的最后一个元素。
  • 最后将数组的大小减少一个。

阵列中的删除操作的算法:-

考虑LA是一个有N个元素的衬里数组,K是一个正整数,使得K<=N。

  1. 开始
  2. 设置J=K
  3. 重复步骤4和5,同时J<N
  4. 设置LA[] =LA[J + 1] 。
  5. J=J+1
  6. 设置N=N-1
  7. 停止

现在,通过这个程序,从数组中删除元素的过程将更加清晰。

#include<iostream> //_____(1)
using namespace std; //____(2)

int main()
{
  int a[50],x,n,i,j,b[50]; //___(3)
  cout<<"How many elements of array you want to create"; //___(4)
  cin>>n; //___(5)
  cout<<"\nEnter elements of array\n"; //___(6)
  
  for(i=0,j=0; i<n; ++i) //___(7)
      cin>>a[i]; //____(8)
      
  cout<<"\Enter element to delete:"; //___(9)
  cin>>x; //___(10)
  
  for(i=0,j=0;i<n;++i) //___(11)
  {
     if(a[i]!=x) //___(12)
       b[j++]=a[i]; //__(13)
  }
  
  if(j==n) //__(14)
  {
       
       cout<<"\nSorry!!!Element is not in the array"; //___(15)
       exit(0);
  }
  else
  {
       cout<<"\nNew array is"; //___(16)
       for(i=0;i<j;i++) //___(17)
          cout<<b[i]<<" "; //_____(18)
  }
  return 0;
  
}

输出:-

How many elements of Array you want to create? 5
Enter elements of Array
14 8 3 6 9
Enter element to delete:6
New Array is 14 8 3 9

根据这个程序:-
(1) 它是输入输出流的代表。(
2) 使用命名空间std意味着你将使用 "std "命名空间的任何类或函数。 (3) 这里
我们定义了数组列表a-b的大小为[50],在这个阶段我们还需要定义哪些变量。 (4) 这里
我们要求用户输入。 (5) 这里
我们让用户提供 "n "的值

(6) 这里我们再次要求用户输入数组列表。
(7) 这里我们使用 "For循环",它将从(0到n-1)执行多达n次,
(
++i)意味着在执行特定语句后i的值增加了1。 (8) 这里
我们把i放在大小为a[50]->i的数组列表中。 (9) 这里我们
要求用户输入。
(10) 这里我们让 "x "的值成为用户想要删除的值。 (11) 这里
我们使用 "For循环",它将从(0到n)执行多达n次,

(

++i)意味着在执行特定语句后i的值增加1。
(12) 这里我们使用 "IF循环",它在处理完当前语句后才会传递到下一个语句,也就是说,如果要删除的输入值不在列表中,那么该值将增加到下一个值(J++)。 (13) 这里
增加的值同样添加到数组列表中。
(14) 这里我们再次使用 "IF循环 "并检查j=n,其中n是用户的输入。 (15) 这里
如果J不等于n,输出将是,没有用户提供的相同的数组列表,并退出。 (16)
在使用 "ELSE循环 "后,我们将制定条件,如果J等于n,那么输出将是新的数组,有正确的用户输入。
(17) 在这里,通过应用 "For循环",我们将删除用户提供的特定值。 (18) 然后,
输出将是没有用户想要删除的元素的b[50]阵列列表。

在C++中删除静态分配的数组

在C++中,一个静态内存分配的数组看起来像。

int array[100];

这个数组不能被明确地删除,它将在整个程序中存在。这是因为静态内存存在于整个程序中,一旦程序进程终止就会自动删除。

删除C++中的动态分配数组

在C++中,一个动态内存分配的数组看起来像。

int* array = new int[100];

一个动态内存分配的数组可以被删除,因为。

delete[] array;

如果我们删除一个动态内存分配数组中的特定元素,那么元素的总数就会减少,所以我们可以减少这个数组的总大小。这将涉及到。

array = (int *)realloc(array, sizeof(int) * (N-1));

这在真正意义上删除了一个元素。

删除一个数组的时间复杂度

删除一个元素的时间复杂度是O(N)时间

这是因为其他元素被移到了被删除元素的位置上。这需要线性时间。如果我们在C++中使用realloc(),实际的内存使用就会减少,但是元素会被移到一个新的位置,所以这是一个开销。

这是对删除数组过程的详细解释,通过这个程序你可以很容易地从数组中删除元素。通过OpenGenus的这篇文章,你一定对在C++中删除数组或删除数组中的一个元素有了完整的概念。

我希望你们都能理解删除数组的过程。
谢谢你们。