999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++STL技術在股市行情排序中的具體應用

2008-12-31 00:00:00
電腦知識與技術 2008年8期

摘要:通過分析股市行情中排序問題的具體問題,滿足目前軟件快速開發的需求,結合STL技術給出解決問題的具體實現方法,并討論STL技術在未來軟件開發中的發展趨勢。

關鍵詞:STL容器;定時排序;即時排序;股市

中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)08-10ppp-0c

股民在使用股票分析軟件的過程中需要及時獲得到股票的各種指標排名,例如今日漲幅排名、今日量比排名等,因此股票服務器軟件為了滿足用戶需求要把從交易所得到的原始數據按照相應計算公式得出排名發送給客戶端軟件,由于客戶端同時登錄服務器的數量比較大,這就需要在實現排名功能時服務器要保證的效率和穩定性,因此開發選擇采用C++STL技術,需要用到STL中的 vector、mulset等容器來輔助實現。

1 對用到的名詞進行解釋:

1.1 STL介紹:

Standard Template Library ,標準模板庫,從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是算法和其他一些組件的集合。容器、算法、和允許算法工作在容器中的元素上的iterator,這就是STL所有的東西。

1.2 定時排序方法:

也稱作時間驅動排序,就是指服務器分析軟件從交易所獲得股票信息的原始數據后整理計算后保存在容器中,設置一定的時間間隔例如10秒鐘,當設置的時間到后就對容器中的所有信息按照一定規則進行排序,然后把排序結果供股票分析軟件客戶端的調用取排序數據,達到指標排序的功能。

1.3 即時排序方法:

也稱數據驅動排序,就是指當股票分析軟件服務器從交易所獲得到的每一筆股票信息的原始數據整理計算后調用相應算法插入到排序結果容器中去,滿足股票分析軟件客戶端的調用取排序數據,達到指標排序的功能。

2 簡化股市排序問題提取模型:

由于股票交易過程中各種指標的數量相當多,為了方便闡述排序方法的實現過程,把股票指標簡化為商品GoodID屬性和最新價格Price屬性,因此抽象定義要排序的原子體為

class SortItem

{

public:

SortItem();

~SortItem();

// 設置商品的最新價格屬性

int SetPriceValue(int nPrice);

// 重載小于運算符,保證兩個對象的比較

bool operator<(const SortItem Item) const;

private:

int m_nGoodId;

int m_nPrice;

};

重載函數的實現定義如下:

bool SortItem::operator<(const SortItem Item) const

{

return m_lValue < Item.m_lValue;

}

3 具體實現:

3.1 簡單介紹定時排序具體實現方法:

首先選擇vector容器存儲SortItem對象,當新商品的數據到達后采用vector 自帶的push_back方法把對象插入到容器中,如果某一商品的更新數據到達后需要從容器中查找到此商品GoodID的存儲位置,調用類SortItem的SetPriceValue方法對數據進行更新。

由于排序要實現的是針對SortItem類中的m_nPrice成員變量的大小比較,而從交易所獲得到的更新數據,是針對 m_nGoodId成員變量把vector中同一商品GoodID對象的m_nPrice值更改,達到數據的更新,如果不考慮存儲策略,每次來新數據后都遍歷vector比較m_nGoodId成員,效率比較低,因此采用MAP容器,針對每個商品ID,存儲此商品ID和此商品ID在vector容器中的位置,即 MAP; 如圖1所以:

MAPm_MapGoodID; vector m_DataVec;

圖1 定時排序存儲結構

當設置的排序時間到達后調用 STL的排序方法 stl::stable_sort(m_DataVec.begin(),m_DataVec.end()); 對原子對象進行排序,并把排序結果復制到結果容器中去。

具體實現如下:

void NormalSortInsertData(SortItem tmpItem)

{

MAP::itertor m_MapIter;

m_MapIter = m_MapGoodID.find(tmpItem.m_nGoodsID);

if(m_MapIter != m_MapGoodID.end()) //找到

{

m_DataVec[m_MapIter->second].SetPriceValue(tmpItem.m_nPrice);

}

else//沒找到

{

m_DataVec.push_back(tmpItem);

m_MapGoodID.insert(std::map::value_type(tmpItem.m_nGoodsID, m_DataVec.size()-1));

}

}

3.2 著重討論即時排序方法:

首先定義存儲結構:分析由于即時排序就需要來了數據馬上進行排序,不可能采用定時排序的存策略,來了數據push到容器中,然后馬上調用 sort方法,在進行復制數據,這樣會帶來太大的CPU和內存的開銷,因此要改變存儲結構,綜觀STL的所有容器最終確定為 set 。首先 set是自動排序的,來了數據只需要調用set的內部方法 insert插入數據即可,但由于set是采用鏈表存儲,因此更新數據時如果不采取措施會帶來很大開銷,需要遍歷鏈表找到所在的位置后才能進行刪除,然后再插入新的對象。這樣每次遍歷查找花費大量CPU時間,采取的對策是:

用 MAP存儲商品ID和此商品ID的當前對象即, 如圖2 所示,當某商品的新的數據到來,針對商品ID在MAP中查找到對應的信息,用臨時對象保存存取的 SortItem 屬性值,然后根據臨時SortItem 去set容器中查找,調用set的erase函數,把臨時對象從容器中查找并刪除,然后調用set的insert方法把新的SortItem對象插入,同時并更新MAP容器重此商品的SortItem 屬性值。達到新來的數據的排序功能。

MAP m_MapGoodID;vectorm_DataVec;

圖2 即時排序存儲結構

由于排序是對 m_nPrice成員進行排序,因此重寫的< ,由于set容器需要存儲的元素大小不能一樣,故重載比較函數

bool SortItem::operator<(const SortItem Item) const

{

if(m_lValue == Item.m_lValue)

return m_nGoodsID < Item.m_nGoodsID ;

else

return m_lValue < Item.m_lValue;

}

說明:當比較的商品m_lValue相同的時候再對m_nGoodsID進行比較,由于每個商品記錄數唯一,因此改寫的比較函數能保證mulset容器元素的唯一性。

具體實現如下:

// 快速排序插入SortItem對象

void QuickSortInsertData(SortItem tmpItem)

{

SortItem oldItem; // 定義一臨時SortItem對象,用來保存MAP容器中原存儲的SortItem 對象

MAP::itertor m_MapIter; // 定義MAP容器的迭代器指針

m_MapIter = m_MapGoodID.find(tmpItem.m_nGoodsID); // 在m_MapGoodID MAP容器中根據商品ID信息查找

if(m_MapIter != m_MapGoodID.end()) //找到

{

oldItem = m_MapIter->second; // 把原來SortItem對象賦給臨時變量

m_MapIter->second = tmpItem; // 把待插對象插入到MAP容器中

if(m_SetSortData.erase(oldItem) == 1)// 從SET中刪除臨時對象

{

m_SetSortData.insert(tmpItem);// 把待插對象插入到MULSETP容器中,達到排序的效果

}}

else//沒找到

{

// 把商品ID和待插對象插入到MAP容器中 m_MapGoodID.insert(std::map::value_type(nGoodsID, tmpItem));

m_SetSortData.insert(tmpItem);// 把待插對象插入到SET容器中,達到排序的效果

}} // 結束

4 兩個方法的優缺點比較:

定時排序方法:實現思路比較簡單,結構清晰,相比起來容易實現,存儲數據采用Vector容器,定時器時間到后調用STL 的sort方法,

缺點是:

(1)數據精度不準確,因為每個商品容器中只能存在一條記錄,會存在這樣的情況,在定時間隔內,同一商品來了兩筆數據,后面的數據會把前面的覆蓋掉,這樣導致數據精度出現問題。

(2)占用大量的存儲空間,因為在排序完成后需要用到內存拷貝技術把排序結構做拷貝供客戶端調用,這樣新來的原始數據不會覆蓋掉排序結果。

定時排序方法:不存在上面定時排序的缺點,但是實現起來比較繁瑣,主要是數據存儲結構的組織,和插入數據排序過程與取數據過程要做到合理的同步,當用戶取數據時不能做插入操作,否則用戶會取得無效的數據。

在用戶對精度要求不是很準確的時候還是采用定時排序方法,結果股市行情的具體情況在很短的時間間隔內不會存在極大的變動,因此定時排序的精度誤差在允許的范圍內,而且程序執行起來比較穩定,容易做出控制,不同客戶端顯示的結果是一致的。實際工作的系統中采用定時方案實現,達到功能需求的目標。

5 總結:

在當今軟件需要快速開發的時代,以從網上搜索一些比較著名的開源軟件項目,可以發現幾乎都是使用C++進行開發的。從它們高品質的源碼可以看出,C++ STL標準模板庫技術使用得非常廣泛。頗負盛名的3D圖形渲染引擎OGRE,就很好地應用了C++ STL庫提供的數據結構和算。現在C++ STL已被納入C++的編程環境中,成為C++標準庫的一個重要組成部分。用戶不必再像以往那樣經常翻閱資料,只需寥寥數行代碼的調用,即可實現常用的數據結構和算法。因此STL技術在未來軟件開發中將會起到舉足輕重的作用。

參考文獻:

[1]P J Plauger,普勞格,等. 王昕,譯.C++STL中文版[M].北京:中國電力出版社,2002.

[2]SCOTT MEYERS.潘愛民,等,譯.EFFECTIVE STL中文版[M].北京:清華大學出版社,2006.

[3]WILLIAM J COLLINS.周翔,譯.數據結構與STL[M].北京:機械工業出版社,2004.

[4]侯捷.STL源碼剖析[M].華中科技大學出版社,2002.

[5]葉至軍.C++ STL開發技術導引[M].人民郵電出版社,2007.

[6]余祥宣,等.計算機算法基礎[M].華中科技大學出版社,2006.

[7]嚴蔚敏,等.數據結構(C語言版)[M].清華大學出版社,1997.

主站蜘蛛池模板: 激情在线网| 欧美三级视频网站| 米奇精品一区二区三区| 久久精品人人做人人爽电影蜜月| 亚洲69视频| 中文字幕1区2区| 亚洲第一香蕉视频| 国产一区三区二区中文在线| 伊人久久福利中文字幕 | 免费高清毛片| 99热这里只有精品在线观看| 欧美精品aⅴ在线视频| 久久青青草原亚洲av无码| 日本草草视频在线观看| 四虎成人在线视频| 四虎综合网| 国产精品主播| 人妻精品久久无码区| 亚洲精品无码av中文字幕| 中日韩一区二区三区中文免费视频| 亚洲AV成人一区二区三区AV| 亚洲国产在一区二区三区| 国产麻豆aⅴ精品无码| 全裸无码专区| 欧美精品亚洲日韩a| 国产一区在线观看无码| 国产噜噜噜| 亚洲美女一区| 99视频在线看| 日韩在线成年视频人网站观看| 亚洲精品视频在线观看视频| 98超碰在线观看| 亚洲V日韩V无码一区二区| 精品国产网站| 欧美成a人片在线观看| 亚洲欧美成人| 老司机精品99在线播放| 亚洲国产看片基地久久1024| 欧美第一页在线| 午夜成人在线视频| 最新国产精品鲁鲁免费视频| 国产中文在线亚洲精品官网| 亚洲精品亚洲人成在线| 国产中文一区a级毛片视频| 日韩午夜片| 久久免费精品琪琪| 国产精品无码一区二区桃花视频| 日本高清成本人视频一区| 国产亚洲日韩av在线| 国产一区二区精品福利| 日韩在线影院| 午夜无码一区二区三区| 国产精品视频第一专区| 亚洲永久视频| 亚洲国内精品自在自线官| 亚洲AⅤ波多系列中文字幕| 亚洲人成在线免费观看| 亚洲精品国产综合99| 国产成人精品无码一区二| 国内毛片视频| 国产在线一区视频| 欧美人与性动交a欧美精品| 国产欧美视频一区二区三区| 无码专区在线观看| 久久精品电影| 国产乱人乱偷精品视频a人人澡| 成人国产精品视频频| 欧美色视频网站| 丰满的熟女一区二区三区l| 天天爽免费视频| 亚洲中文字幕在线观看| 欧美精品综合视频一区二区| 日韩黄色在线| www.91中文字幕| 日韩不卡免费视频| 日韩精品无码免费专网站| 欧美成人午夜在线全部免费| 国产青榴视频| 亚洲一级毛片| 正在播放久久| 黄色网站在线观看无码| 久久精品视频一|