簡體   English   中英

如何使用一個 function 按結構中的不同變量排序

[英]How can I use one function to sort by different variables in a struct

在我的程序中,我有這個結構:

struct Record {
string ID;
string name;
int quantity;
double price; 
};

我還有一個 function 應該對指向 Record 的指針數組進行冒泡排序,如下所示:

void printAscending(Record* pitemList[50], int arraySize) {
  int Swap;
  Record* Temp;
  do{
    Swap = 0;
    for(int i = 0; i < (arraySize - 1); i++) {
      if ((pitemList[i] -> quantity) > (pitemList[i + 1] -> quantity)){
        Temp = pitemList[i];
        pitemList[i] = pitemList[i + 1];
        pitemList[i + 1] = Temp;
        Swap = 1;
      }
    }
  } while (Swap != 0);
}

struct 中有四個不同的變量,我必須讓用戶選擇一個進行排序。 我不能為每個變量創建四個不同的函數,也不能為每個變量復制和粘貼相同的冒泡排序代碼四次。 有沒有辦法用一組可以按四個不同變量排序的冒泡排序代碼創建一個 function?

不確定我理解你想要什么,但是為了概括你的代碼以使用記錄的不同成員作為比較器,我想你可以將指向成員的指針作為模板參數傳遞。

您已將問題標記為 ,因此您可以將auto用於模板參數,因此:

template <auto Record::* rMember>
void printAscending (Record* pitemList[50], int arraySize)
 {
   bool Swap;

   do
    {
      Swap = false;

      for (int i = 0; i < (arraySize - 1); i++)
       {
         if ( pitemList[i]->*rMember > pitemList[i + 1]->*rMember )
          { 
            std::swap(pitemList[i], pitemList[i+1]);

            Swap = true;
          }
       }
    }
   while ( true == Swap );
 }

你可以這樣稱呼它:

printAscending<&Record::quantity>(itemList, sizeItemList);

我是從頭頂上寫的,但我認為這是正確的一步。

你需要有幾個這樣的功能:

bool compareByQuantity(const Record &a, const Record &b) {
    return a.quantity < b.quantity;
}

您需要為每個屬性實現此功能。 然后,要對此進行排序,您可以為排序方法提供第三個參數......第三個參數是 function。 像這樣

std::sort(records.begin(), records.end(), compareByQuantity);

希望這能讓你走上正確的軌道

排序文檔鏈接: https://en.cppreference.com/w/cpp/algorithm/sort

正如@Ted Klein Bergman 所指出的,您也可以像這樣直接使用 lambda

std::sort(records.begin(), records.end(), [](const Record &a, const Record &b){ return a.quantity < b.quantity }); 

我認為使用 std::sort 會更好,它可以讓您只編寫比較函數並負責排序。 你可以使用這些:

#include <algorithm>

bool compareIDs(const Record *r1, const Record *r2) { return r1->ID < r2->ID; }
bool compareNames(const Record *r1, const Record *r2) { return r1->name < r2->name; }
bool compareQuantities(const Record *r1, const Record *r2) { return r1->quantity < r2->quantity; }
bool comparePrices(const Record *r1, const Record *r2) { return r1->price < r2->price; }

// And call sort like this: std::sort(array1, array2, compareIDs);

參考:
https://en.cppreference.com/w/cpp/algorithm/sort
https://en.cppreference.com/w/cpp/named_req/Compare

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM