關於std::list的sort函式在VC6下的修正 (轉)

amyz發表於2007-11-16
關於std::list的sort函式在VC6下的修正 (轉)[@more@]

關於std::list的sort在VC6下的修正

徐巖柏:namespace prefix = o ns = "urn:schemas--com::office" />

  你可能也在使用c++的標準庫,是不是感覺很好?本人在做專案的過程中發現這樣的一個問題,我的list中儲存的是一個個,我在使用該列表的過程中要依據物件的一個關鍵字進行排序。你可能會說:這還不容易嗎!list 中有個sort函式就可以完成。不錯,標準c++當然支援自定義運算元排序函式,如果你用vc7 或g++ 就沒有問題了,如果你是使用vc6.0如下的程式程式碼就不能編譯:

#include

#include

#include

#include

 

struct S {

  std::string firstname;

  std::string secondname;

  int ID;

};

struct comp{

public:

  bool operator()(S& a,S& b)

  {

  return a.ID < b.ID;

  }

};

int main(int argc, char* argv[])

{

  std::list mylist;

  std::list::iterator iter;

  S a;

  a.firstname ="dfadf";

  a.ID = 5;

  mylist.push_back (a);

 

  a.firstname ="得到";

  a.ID = 9;

  mylist.push_back (a);

 

  a.firstname ="xxx";

  a.ID = 7;

  mylist.push_back (a);

 

  a.firstname ="gggg";

  a.ID = 25;

  mylist.push_back (a);

 

  mylist.sort(comp());

  for (iter = mylist.begin(); iter != mylist.end();++iter)

  {

    std::cout <(*iter).ID << "t";

  }

  std::cout <<:endl>

  return 0;

}

 

本人對list觀察發現,有這樣一行

  typedef greater<_ty> _Pr3;

 而它的sort函式也正是使用了該定義運算元。

  void sort(_Pr3 _Pr)

……..

難怪我們的程式不能使用自己的比較運算元函式comp 。經過這麼一分析,我們要想使用該功能,就必須對該定義做修改,要知道vc6中的stl系列檔案都是1998年前的老古董了,看起來沒有競爭對的發展是不利的。本人對list檔案中的merge和sort函式進行了修改,具體程式碼如下:

 template
 merge(_Myt& _X, _StrictWeakOrdering __comp)
 {if (&_X != this)
 {iterator _F1 = begin(), _L1 = end();
 iterator _F2 = _X.begin(), _L2 = _X.end();
 while (_F1 != _L1 && _F2 != _L2)
 if (__comp(*_F2, *_F1))
 {iterator _Mid2 = _F2;
 _Splice(_F1, _X, _F2, ++_Mid2);
 _F2 = _Mid2; }
 else
 ++_F1;
 if (_F2 != _L2)
 _Splice(_L1, _X, _F2, _L2);
 _Size += _X._Size;
 _X._Size = 0; }}

  template

    sort(_Ordering __comp)

  {

  if (2 <= size())

    {const size_t _MAXN = 15;

    _Myt _X(allocator), _A[_MAXN + 1];

    size_t _N = 0;

    while (!empty())

    {_X.splice(_X.begin(), *this, begin());

    size_t _I;

    for (_I = 0; _I < _N && !_A[_I].empty(); ++_I)

    {_A[_I].merge(_X, __comp);

    _A[_I].s(_X); }

  if (_I == _MAXN)

    _A[_I].merge(_X, __comp);

    else

    {_A[_I].swap(_X);

  if (_I == _N)

    ++_N; }}

    while (0 < _N)

    merge(_A[--_N], __comp); }}

 

你可以把該檔案中的原來的兩個對應的函式遮蔽調。經過這樣修改,上面的我們的程式可以正確的執行了。你是不是心動了呢,去試試把。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982824/,如需轉載,請註明出處,否則將追究法律責任。

相關文章