C++程序:从数组中获取最后给定数量的项目


数组是一种专门的数据结构,用于在一系列内存区域中保留同构(**相似**)数据。使用数组的主要优点是我们可以使用索引参数从任何我们想要的地方访问它们。但是,插入和删除数据需要顺序操作,这使得这种数据结构成为线性数据结构。我们只需使用方括号中的元素的索引或位置号即可从数组中获取它。本文将演示如何在C++中读取数组中最近的k个数字。

通过示例理解概念

Given array A = [10, 14, 65, 85, 96, 12, 35, 74, 69]
We have another number k = 4
The number of elements in A is 9

The output will be the last k elements from A, which are:
12, 35, 74, 69

对于每个数组,我们都有数组内的元素,数量n也很重要。数字n表示数组中存在多少个有效元素。数组的大小可能与n不匹配。尽管数组最多可以有Z个元素,但只有n个元素必须有效;其余的槽位是空的。在这种情况下,k必须小于或等于n才能从数组中检索第k个元素。在提取组件之前,我们必须检查它。为了更好地理解,让我们看看算法。

算法

  • 读取输入数组A。还要输入其中的元素数量:n和k,以从A读取前k个元素

  • 创建一个空数组B

  • 如果k < n,则

    • 对于范围从0到k-1的i,执行

      • B[i] = A[n - k + i]

    • 结束循环

  • 结束判断

  • 返回B

示例

#include <iostream>
# define Z 50

using namespace std;

void displayArr(int arr[], int n){
   for( int i = 0; i < n; i++ ){
      cout << arr[ i ] << ", ";
   }
   cout << endl;
}

void pickLastKElement( int A[], int n, int B[], int &m, int k) {
   if( k <= n ){
      for( int i = 0; i < k; i++ ) {
         B[ i ] = A[ n - k + i ];
         m = m + 1;
      }   
   }
}

int main() {
   int A[ Z ] = {57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14};
   int n = 12;
   
   int B[ Z ];
   int m = 0;
   
   cout << "Given Array: ";
   displayArr( A, n );
   
   pickLastKElement( A, n, B, m, 7 );
   cout << "The last 7 element from A: ";
   displayArr( B, m );
   
   m = 0;
   
   pickLastKElement( A, n, B, m, 10 );
   cout << "The last 10 element from A: ";
   displayArr( B, m );
}

输出

Given Array: 57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14, 
The last 7 element from A: 52, 86, 14, 76, 65, 32, 14, 
The last 10 element from A: 44, 19, 86, 52, 86, 14, 76, 65, 32, 14,

使用向量

上述方法使用静态数组来存储和检索数组元素。向量也可以做到同样的事情。向量是C++ STL的一部分,是动态数组。让我们看看代码。算法保持不变。

示例

#include <iostream>
#include <vector>
# define Z 50

using namespace std;

void displayArr( vector<int> v ){
   for( int i = 0; i < v.size() ; i++ ){
      cout << v[ i ] << ", ";
   }
   cout << endl;
}

vector<int> pickLastKElement( vector<int> A, int k) {
   vector<int> B;
   if( k <= A.size() ){
      for( int i = 0; i < k; i++ ) {
         B.push_back( A[ A.size() - k + i ] );
      }   
   }
   return B;
}

int main() {
   vector<int> A = {57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14}; 
   
   vector<int> B;
   
   cout << "Given Array: ";
   displayArr( A );
   
   B = pickLastKElement( A, 7 );
   cout << "The last 7 element from A: ";
   displayArr( B ); 
   
   B = pickLastKElement( A, 10 );
   cout << "The last 10 element from A: ";
   displayArr( B ); 
}

输出

Given Array: 57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14, 
The last 7 element from A: 52, 86, 14, 76, 65, 32, 14, 
The last 10 element from A: 44, 19, 86, 52, 86, 14, 76, 65, 32, 14,

使用向量构造函数

最后一种方法是一个手动过程,我们首先创建一个空向量,然后逐个复制元素。但是,我们可以使用向量构造函数中的向量迭代器直接复制最后的k个元素。让我们看看代码来理解这个概念。

示例

#include <iostream>
#include <vector>
# define Z 50

using namespace std;

void displayArr( vector<int> v ){
   for( int i = 0; i < v.size() ; i++ ){
      cout << v[ i ] << ", ";
   }
   cout << endl;
}

vector<int> pickLastKElement( vector<int> A, int k) {
   vector<int> B( A.begin() + (A.size() - k), A.end() );
   return B;

}

int main() {
   vector<int> A = {57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14}; 
   
   vector<int> B;
   
   cout << "Given Array: ";
   displayArr( A );
   
   B = pickLastKElement( A, 7 );
   cout << "The last 7 element from A: ";
   displayArr( B ); 
   
   B = pickLastKElement( A, 10 );
   cout << "The last 10 element from A: ";
   displayArr( B ); 
}

输出

Given Array: 57, 10, 44, 19, 86, 52, 86, 14, 76, 65, 32, 14, 
The last 7 element from A: 52, 86, 14, 76, 65, 32, 14, 
The last 10 element from A: 44, 19, 86, 52, 86, 14, 76, 65, 32, 14,

这里,B向量是用A向量的最后k个元素创建的。`begin()`方法用于获取第一个项目的地址,并使用`begin()`作为(A.size() - k)的偏移量,我们可以到达`A.end()`。所以它将指向最后的k个元素。

结论

本文介绍了三种不同的读取或选择给定数组中最后n个数字的方法。第二和第三种解决方案基于向量,而不是第一种方法使用的静态默认数组。前两个问题的答案很简单。我们使用for循环逐个复制最后的k个元素。最后一种方法最简单,它使用向量构造函数通过使用该向量的迭代器从另一个向量复制组件来生成向量。

更新于:2022年12月13日

313 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.