關於std::list的sort函式在VC6下的修正 (轉)
關於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 <
}
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python用List的內建函式list.sort進行排序Python函式排序
- 排序(對於 sort 函式的使用)排序函式
- std list/vector sort 排序就這麼簡單排序
- std::string的工具函式函式
- std::count 函式函式
- 關於字串的幾個有用函式 (轉)字串函式
- sort()函式函式
- 關於linux下system()函式的總結Linux函式
- 關於container_of和list_for_each_entry 及其相關函式的分析AI函式
- std::vector 和 std::list 區別
- 關於stable_sort()和sort()的區別:
- 聊聊sort函式函式
- 關於在oracle 的group by中使用自定義函式Oracle函式
- javascript的sort()函式用法詳解JavaScript函式
- matlab中sort函式的用法Matlab函式
- 關於count函式的理解函式
- 關於lag函式的用法函式
- 關於scanf函式的問題函式
- 關於函式索引的問題?函式索引
- Oracle中關於函式的使用Oracle函式
- 關於qt中的tr()函式QT函式
- 關於Oracle取整的函式Oracle函式
- 摘-- 關於在函式或過程中 ref cursor 的用法函式
- std::map initializer list syntax ?
- 關於建構函式與解構函式的分享函式
- 關閉 linux下的umask( )函式、setsid( )函式Linux函式
- PHP中的list()函式入門PHP函式
- 去重函式unique,sort,erase的應用函式
- C++ sort排序函式的用法總結C++排序函式
- 關於cuda中的函式問題函式
- 關於oracle內建函式的使用Oracle函式
- 關於字串的功能函式小結字串函式
- 關於在PostgreSQL中使用extract函式以及epochSQL函式
- 關於在linux下磁碟定額的實現(轉)Linux
- 關於WriteFile函式的lpNumberOfBytesWritten在Win8開始的不同函式
- std::sort 錯誤"Expression : invalid operator <"Express
- stl中的sort函式,你真的瞭解嗎函式
- 關於 js 中的回撥函式 callbackJS函式