我工作的一個實在太差了設計項目,我已經在這個數據結構跌跌撞撞:如何創建特定的std :: vector迭代器?
class OldBagOfData
{
public:
std::vector< BaseClass* > baseDatas;
std::vector< Derived1* > derived1Datas;
std::vector< Derived2* > derived2Datas;
std::vector< Derived3* > derived3Datas;
std::vector< Derived4* > derived4Datas;
}
更新的類的方法是使用一個可怕的很多的if/else條件語句(幾十)並且成員是可修改的(最重要的是它使用指針而不是實例),儘管我們只是讀取數據。
class CurrentBagOfData
{
private:
std::vector< BaseClass* > genericContainer;
Template< typename DataType>
std::vector< DataType* > getData(datatype IDtype);
public:
std::vector< BaseClass* > getbaseDatas(); /* = getData<Base>("base") */
std::vector< Derived1* > getDerived1Datas(); /* = getData<Derived1>("derived1") */
std::vector< Derived2* > getDerived2Datas(); /* = getData<Derived2>("derived2") */
std::vector< Derived3* > getDerived3Datas(); /* = getData<Derived3>("derived3") */
std::vector< Derived4* > getDerived4Datas(); /* = getData<Derived4>("derived4") */
}
然而,因爲我只是讀DATAS和排隊新的輸入,我想用迭代器:
// This loop is forbidden because obod.getDerived1Datas() is a temporary object
for(std::vector<Derived1*>::iterator it = obod.getDerived1Datas().begin();
it != obod.getDerived1Datas().end(); i++)
{
/* processing *it */
}
//What I want to do :
for(std::vector<Derived1*>::iteratorDerived1 it = obod.begin(); it != obod.end(); i++)
{
// it iterate over every Derived1 datas in the generic container
/* processing *it */
}
我已經通過使用通用的功能和模板簡化了代碼
如何創建std :: vector :: iteratorDerivedX?歡迎對我設計的任何其他建議。
爲什麼你不返回對get *函數中的向量的引用?嘗試返回迭代器時會出現什麼樣的錯誤? – 2013-04-04 11:26:13
所以在你的「當前」中你有一個主向量,並且當你需要模板函數中的派生版本(是嗎?)時複製它,並返回臨時值。我可能會問的一件事是矢量(儘管重複)的損失是否會導致速度放慢 - 是否首先出現速度重複? – Caribou 2013-04-04 11:33:58
@ W.B:當直接使用迭代器時,我得到運行時錯誤「vector not derefenced」(或多或少)。 – lucasg 2013-04-04 11:48:53