我有一個物件向量。這些物件中的每一個都有 2 個欄位(其值可以重復),例如:
//myClass name = myClass(x,y)
myClass obj1 = myClass(2,5);
myClass obj2 = myClass(2,4);
myClass obj3 = myClass(1,5);
myClass obj4 = myClass(3,2);
std::vector<myClass> myVector;
myVector.push_back(obj1);
myVector.push_back(obj2);
myVector.push_back(obj3);
myVector.push_back(obj4);
我想對向量進行排序。首先它應該按第一個值排序。如果第一個變數的值相同,則應按第二個變數排序。排序后的向量應該是這樣的:
- obj3 //(1,5)
- obj2 //(2,4)
- obj1 //(2,5)
- obj4 //(3,2)
我用冒泡排序寫了這個簡單的代碼:
for (int i = 0; i < myVector.size(); i )
{
for (int j = 0; j < myVector.size() - 1; j )
{
if (myVector[j].x < myVector[j 1].x)
std::swap(myVector[j], myVector[j 1]);
}
}
現在myVector按第一個值排序,但是如何按第二個值對第一個值相同的元素進行排序?就像在例子中?
uj5u.com熱心網友回復:
你可以嘗試這樣的事情:
for (int i = 0; i < myVector.size(); i )
{
for (int j = 0; j < myVector.size() - 1; j )
{
if (myVector[j].x < myVector[j 1].x)
{
std::swap(myVector[j], myVector[j 1]);
}
else if (myVector[j].x == myVector[j 1].x)
{
if (myVector[j].y < myVector[j 1].y)
std::swap(myVector[j], myVector[j 1]);
}
}
}
uj5u.com熱心網友回復:
您可以將 if 陳述句更改為:
if ( (myVector[j].x == myVector[j 1].x) ? (myVector[j].y < myVector[j 1].y) : (myVector[j].x < myVector[j 1].x) )
uj5u.com熱心網友回復:
對于初學者,如果您想按升序對向量進行排序,那么至少您需要按以下方式使用 if 陳述句
if (myVector[j 1].x < myVector[j].x)
std::swap(myVector[j], myVector[j 1]);
代替
if (myVector[j].x < myVector[j 1].x)
std::swap(myVector[j], myVector[j 1]);
一種簡單的方法是使用標std::tie頭中宣告 的標準函式<tuple>。
例如
#include <tuple>
//...
for (int i = 0; i < myVector.size(); i )
{
for (int j = 0; j < myVector.size() - 1; j )
{
if ( std::tie( myVector[j 1].x, myVector[j 1].y ) <
std::tie( myVector[j].x, myVector[j].y ) )
std::swap(myVector[j], myVector[j 1]);
}
}
您可以使用標準演算法代替手動撰寫的回圈std::sort。例如
#include <tuple>
#include <vector>
#include <iterator>
#include <algorithm>
//...
std::sort( std::begin( myVector ), std::end( myVector ),
[]( const auto &obj1, const auto &obj2 )
{
return std::tie( obj1.x, obj1.y ) < std::tie( obj2.x, obj2.y );
} );
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/463567.html
上一篇:快速排序樞軸的一個特殊案例
