簡體   English   中英

使用std :: sort在自定義類C ++中對向量進行排序

[英]Sorting a vector inside a custom class C++ using std::sort

如何使用std :: sort在自定義類中對兩個向量進行排序?

舉例來說,假設我有一個包含兩個向量(id和標記)的類。 初始化向量后,我想通過標記對此類的元素進行排序,並保留ID中的排序順序。

我嘗試使用自定義std::sort函數來執行此操作。

class Example
{
public:
    void init();
    static bool sortByMarks(const Example &lhs, const Example &rhs);
    //....other functions

private:
    vector<int> ids;
    vector<int> marks;
    //....other variables   
}
void Partition::init()
{
    ids.resize(5);
    marks.resize(5);
    for(int i=0;i<5;i++)
         ids[i]=i+1;
    marks[0]=47;marks[1]=44;marks[2]=88;marks[3]=52;marks[4]=46;
}
bool Partition::sortByMarks(const Example &lhs, const Example &rhs);
{
    return lhs.marks < rhs.marks;
}

編輯:[通過在函數調用中添加Example ::來解決此問題]我在調用此函數時遇到了麻煩。 我嘗試了以下方法:

Example e; 
sort(&e, &e, Example::sortByMarks);

輸入樣例:

ids : 1,2,3,4,5 marks: 47,44,88,52,46

樣本輸出:

ids : 2,5,1,4,3 marks: 44,46,47,52,88

任何幫助表示贊賞!

編輯:標記向量是我想要排序的(ids也應相應地更改)

我認為您無法使用此類矢量來實現。 您需要以某種方式將ID與標記配對,例如使用地圖,成對向量或類似方法:

class Example{
public:
    void init();
    void sortByMarks();

private:
    struct Students{
        int ids;
        int marks;
    };
    std::vector < Students > students;

};

void Example::sortByMarks(){
    std::sort(students.begin(), students.end(), [](Students a, Students b){
        return a.marks < b.marks;
    });
}


int main(){
    Example e;
    e.sortByMarks();
}

或者,您可以編寫自己的排序:

void selection_sort(){
    int size = marks.size();
    for (int i = 0; i < size - 1; i = i + 1){
        int min = i;
        for (auto j = i + 1; j < size; j = j + 1){
            if (marks[j] < marks[min]){ min = j; }
        }
        std::swap(marks[i], marks[min]);
        std::swap(ids[i], ids[min]);    // add this extra line
    }
}
// .h file
class MarkersDetector
{
    public:
        void sortMarkers(std::vector<cv::Point2f> &markers);
        // Other functions...
    private:
        // Other variables...
};

// .cpp file
// Function for sort the marker points
bool comparePoints(cv::Point2f point1, cv::Point2f point2)
{
    if (point1.x < point2.x)
    {
        return true;
    }
    else
    {
        if ((point1.x == point2.x) && (point1.y < point2.y))
        {
            return true;
        }
    }

    return false;
}

void MarkersDetector::sortMarkers(std::vector<cv::Point2f> &markers)
{
    std::sort(markers.begin(), markers.end(), comparePoints);
}

需要兩件事:

  1. 由於sortByMarks是其成員的Example ,你需要告訴編譯器的正確范圍或功能不會被發現:

     sort(e, e, Example::sortByMarks); 
  2. 然后出現一個問題,因為sortByMarks是一個普通的成員函數,而普通的成員函數期望一個隱藏的第一個參數,它是指向該成員函數被調用的實例的指針,並且成為該函數內部的this指針。 您可以通過將成員函數static來解決此問題:

     static bool sortByMarks(const Example &lhs, const Example &rhs); 

還有第三個問題,那就是std::sort函數實際上不會任何東西進行排序 調用它的方式是告訴它對大小為零的數組進行排序。


老實說,我認為您並未完全解決問題。 我猜你真正想要是若干個對象,每個都包含一個標記,然后排序包含標記物的載體。

就像是

class Example
{
private:
    int mark;

public:
    Example(int m) : mark(m) {}

    int get_mark() const { return mark; }
};

bool operator<(const Example& e1, const Example& e2)
{
    return e1.get_mark() < e2.get_mark();
}

std::vector<Example> example_vector = {
    Example(5),
    Example(1),
    Example(3)
};

std::sort(std::begin(example_vector), std::end(example_vector));

暫無
暫無

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

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