std::sort 関数を使用して、偶数または奇数で数値を並べ替えることができるかどうかを知りたいです。
次のコードがありますが、std::sort で実装する方法がわかりません
inline bool isEven(const Point n) {
return n.getX()%2==0;
}
これは正しいです
vector<Point> c;
std::sort(c.begin(),c.end(),isEven)
ご意見をお聞かせください。
あなたの質問について私が理解していることから、あなたはodd
とeven
数字を分けたいと思っています。その場合は、そのstd::partition
とおりにします。
昇順の値と区切りodd
とeven
数字で並べ替えたい場合は、このコードに似たものを使用します (それでも、Point
並べ替えたいコンポーネントを特定する必要があります)。
bool sortByEven(const int& left, const int& right)
{
if(left & 1 && right & 1) // both are odd
{
return left < right;
}
else if(left & 1) // left is odd
{
return false;
}
else if(right & 1) // right is odd
{
return true;
}
// both are even
return left < right;
}
この関数は で使用できますstd::sort
。短い例を次に示します。
std::vector<int> numbers;
numbers.push_back(-1);
numbers.push_back(5);
numbers.push_back(12);
numbers.push_back(7);
numbers.push_back(-31);
numbers.push_back(-20);
numbers.push_back(0);
numbers.push_back(41);
numbers.push_back(16);
std::sort(numbers.begin(), numbers.end(), sortByEven);
次の出力が得られます。
-20 0 12 16 -31 -1 5 7 41
他のタイプの場合は、単に変更するint
か、template
パラメーターにします
このためには、std::partition
代わりにを使用する必要がありますstd::sort
vector<Point> c;
std::partition(c.begin(),c.end(),isEven)
並べ替えでは、通常、任意の2つの要素の相対的な順序に基づいて並べ替えを行う必要があります。この場合、要素の固有のプロパティに基づいて入力を分割するだけです。どちらの場合ももう一方に減らすことができますが、直接的なアプローチを取る方が常に少し簡単です。
あなたは次のような比較関数を書くことができます
bool evenOddLess( Point const& a, Point const& b )
{ return (isEven( a ) < isEven( b )); }
次に、それをの3番目の引数として使用できますstd::sort
。
の参照をstd::sort
見ると、比較に使用する関数が、比較する必要がある2 つの引数を取る必要があることがわかります。したがって、コードはまったく機能しません。
代わりに、ベクトルを反復処理して、偶数の値を 1 つの一時的なベクトルに分類し、奇数の値を別の一時的なベクトルに分類することをお勧めします。次に、実際のベクトルをクリアし、2 つの一時ベクトルを好きな順序で追加します。
C#ではさらに簡単です。
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14 };
//using delegate
Array.Sort (numbers, (x, y) => x % 2 == y % 2 ? 0 : x % 2 == 1 ? -1 : 1);
Array.ForEach(numbers, x => Console.Write(x));
Console.WriteLine("");
//using custom comparer
CustomComparer comparer = new CustomComparer();
Array.Sort(numbers, comparer);
Array.ForEach(numbers, x => Console.Write(x));
Console.WriteLine("");
//using lambda
int[] items = numbers.OrderBy(x => x % 2 == 0).ThenBy(x => x % 2).ToArray();
Console.WriteLine("");
Array.ForEach(items, x => Console.Write(x));
}
public int Compare(int x, int y)
{
return x % 2 == y % 2 ? 0 : x % 2 == 1 ? -1 : 1;
}
}
public class CustomComparer : IComparer<int>
{
int IComparer<int>.Compare(int x, int y)
{
return x % 2 == y % 2 ? 0 : x % 2 == 1 ? -1 : 1;
}
}