3

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)

ご意見をお聞かせください。

4

6 に答える 6

7

あなたの質問について私が理解していることから、あなたはoddeven数字を分けたいと思っています。その場合は、そのstd::partitionとおりにします。

昇順の値と区切りoddeven数字で並べ替えたい場合は、このコードに似たものを使用します (それでも、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パラメーターにします

于 2012-11-16T13:30:33.467 に答える
5

このためには、std::partition代わりにを使用する必要がありますstd::sort

vector<Point> c;
std::partition(c.begin(),c.end(),isEven)

並べ替えでは、通常、任意の2つの要素の相対的な順序に基づいて並べ替えを行う必要があります。この場合、要素の固有のプロパティに基づいて入力を分割するだけです。どちらの場合ももう一方に減らすことができますが、直接的なアプローチを取る方が常に少し簡単です。

于 2012-11-16T12:48:50.200 に答える
1

あなたは次のような比較関数を書くことができます

bool evenOddLess( Point const& a, Point const& b )
{ return (isEven( a ) < isEven( b )); }

次に、それをの3番目の引数として使用できますstd::sort

于 2012-11-16T12:44:10.133 に答える
1

の参照をstd::sort見ると、比較に使用する関数が、比較する必要がある2 つの引数を取る必要があることがわかります。したがって、コードはまったく機能しません。

代わりに、ベクトルを反復処理して、偶数の値を 1 つの一時的なベクトルに分類し、奇数の値を別の一時的なベクトルに分類することをお勧めします。次に、実際のベクトルをクリアし、2 つの一時ベクトルを好きな順序で追加します。

于 2012-11-16T12:42:53.213 に答える
0

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;
        }
    }
于 2012-12-20T22:26:54.383 に答える