![](/img/trans.png)
[英]Sorting a Vector of a custom class with std::sort() causes a segmentation fault
[英]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);
}
需要兩件事:
由於sortByMarks
是其成員的Example
,你需要告訴編譯器的正確范圍或功能不會被發現:
sort(e, e, Example::sortByMarks);
然后出現一個問題,因為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.