關於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 函式的使用)排序函式
- for (auto it = _list.begin(); it != _list.end(); )關於在for迴圈中使用std::vector中的begin和end
- 關於linux下system()函式的總結Linux函式
- sort()函式函式
- std::count 函式函式
- 關於stable_sort()和sort()的區別:
- 關於count函式的理解函式
- std::vector 和 std::list 區別
- 關於建構函式與解構函式的分享函式
- C++ sort排序函式的用法總結C++排序函式
- 去重函式unique,sort,erase的應用函式
- 關於cuda中的函式問題函式
- 關於字串的功能函式小結字串函式
- std::sort 錯誤"Expression : invalid operator <"Express
- 關於在PostgreSQL中使用extract函式以及epochSQL函式
- mybatis關於list的foreach的使用MyBatis
- stl中的sort函式,你真的瞭解嗎函式
- [藍橋杯][演算法提高VIP]前10名 Java陣列,list升序,降序,逆序函式Collections.sort和Arrays.sort的使用演算法Java陣列函式
- 關於 js 中的回撥函式 callbackJS函式
- 關於python建構函式的過載Python函式
- 關於scala中的主建構函式函式
- 關於執行緒的幾個函式執行緒函式
- 關於C++當中的“模板函式”C++函式
- 對”在嵌入式Rust中使用std“的看法Rust
- 關於函式指標函式指標
- [LeetCode] 148. Sort ListLeetCode
- LeetCode | 148. Sort ListLeetCode
- 關於PostgreSQL的系統資訊函式的OIDSQL函式
- C++11中std::move、std::forward、左右值引用、移動建構函式的測試C++Forward函式
- 關於緩動動畫函式的封裝動畫函式封裝
- 關於Vue中常用的工具函式封裝Vue函式封裝
- 關於javascript中變數及函式的提升JavaScript變數函式
- 關於虛擬函式的一些理解函式
- 關於 Math.random 的一些函式random函式
- 關於變數的宣告和定義、內部函式和外部函式變數函式
- Arr::sort()輔助函式對多維陣列的排序函式陣列排序
- python關於函式形參Python函式
- LeetCode | 147. Insertion Sort ListLeetCode