C++\CLI

CLI数组排序

2020-11-01  本文已影响0人  左图右码

数组排序(Array::sort)

静态函数System::Array::Sort可对cli::array<T>进行排序。
Sort函数有17个,如下:

最直接的排序需要类型T实现了System::IComparable接口.

ref class testclass :  public System::IComparable
{
public:
    testclass(int i) :m_i(i) {}
    int m_i;
    virtual Int32 CompareTo(System::Object^ obj)
    {
        if (auto v = dynamic_cast<testclass^>(obj))
        {
            return this->m_i < v->m_i;
        }
        else
        {
            throw gcnew System::ArgumentException("");
        }
    }
};
//直接的排序
cli::array<testclass^>^ arr = {gcnew testclass(111),gcnew testclass(2),gcnew testclass(3)};
System::Array::Sort(arr);

使用排序准则System::Comparison<T>

System::Comparison<T>是cli定义的委托,可以通过该委托调用自定义的函数进行比较

ref class testclass
{
public:
    testclass(int i) :m_i(i) {}
    int m_i;
};
//定义排序准则函数
Int32 compareClass(testclass^ a, testclass^ b)
{
    return a->m_i > b->m_i;
}
//用委托调用排序准则函数
cli::array<testclass^>^ arr = {gcnew testclass(111),gcnew testclass(2),gcnew testclass(3)};
auto compare = gcnew System::Comparison<testclass^>(compareClass);
System::Array::Sort(arr, compare);

使用范型接口

System::Collections::Generic::IComparer<T>是个范型接口,用特定类型实现它以后,可用于排序。

ref struct compareStr : System::Collections::Generic::IComparer<testclass^>
{
    virtual Int32 Compare(testclass^ x, testclass^ y)
    {
        return x->m_i < y->m_i;
    }
};
//使用接口类排序
System::Array::Sort(arr, gcnew compareStr);

使用CLI接口

与范型接口不同,使用CLI接口则需要进行拆箱操作,显式拆箱操作需要考虑失败的处理。

ref struct compareStrCli : System::Collections::IComparer
{
    virtual Int32 Compare(System::Object^ x, System::Object^ y) override
    {
        auto xo = dynamic_cast<testclass^>(x);
        auto yo = dynamic_cast<testclass^>(y);
        if (xo && yo)
        {
            return xo->m_i < yo->m_i;
        }
        else
        {
            throw gcnew System::InvalidCastException("");
        }
    }
};
//使用cli接口,需要拆箱的操作
System::Array::Sort(arr, gcnew compareStrCli);

注意:两个接口处于不同的namespace:

  1. System::Collections::IComparer
  2. System::Collections::Generic::IComparer<T>

图示里的前8种都是旧式的方法,应该优先使用更先进的范型接口和类。

上一篇 下一篇

猜你喜欢

热点阅读