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.