看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《jackwei (吐司)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Dev-C++ : 問題(Question): : 自己創了一個 class Agent 其中的 data member 沒有 pointer : 另創了一個 class CS 其中的 data member 想要含有: : 1. vector<Agent> member : 2. vector< vector<Agent*> > structure : 而 structure 當中的 vector<Agent*> 中的 Agent* 含的位置 : 就是 member 裡的 Agent 地址 : 請問要怎麼達成呢?? : 程式碼(Code): : class CS //brief for coalition structure : { : public: : CS(int); : ~CS(); : .... : private: : int size; : vector< Agent > member; : vector< vector<Agent*> > structure; // { {2,3},{1},{4,5} } : }; : CS::CS(int n) : { : vector<Agent*> onlyone; //初始狀態 structure 只含一個 vector : for(int i=1;i<=n;i++){ : Agent agent(i); //初始化 agent 的 id : member.push_back(agent); : onlyone.push_back( &(member.at(i-1)) ); //應該是這行有問題 : } : structure.push_back(onlyone); : size = n; : cout<<member[0].id()<<endl; //印出 1 : cout<<onlyone[0]->id()<<endl; //印出亂數 : cout<<structure[0].at(0)->id()<<endl; //印出亂數 : } : 而且還得確保 constructor 結束之後 : member 和 structure 的內容有正確對應到才行 : 應該怎麼修正呢 : 先謝謝大家了 我猜你想達成的功能可能是:    1.可用二維陣列以及一維陣列的手法存取到同一個元素 不過因為 STL containers的 by value語意, 所以你不得不轉從 存指標下手, 但是又因為涉及到繁複的記憶體管理的問題, 使你 想把所有事情都丟給 vector<T>處理, 導致了下面的情形: 2.被操作的元素都存在 vector<T>裡 你的想法沒錯, 不過就如推文中akasan大所提的, 你沒注意到會 有重配置的情況發生, 為了避免dangling pointer生成, 成員函 式 reserve可以先配置足夠的記憶體, 或是全部元素都push完再 一個個取位址:   member.reserve( n ); 無論 Agent::Agent(int) 是否被標示為 explicit, 迴圈都可以 改成這樣:   for( int i = 1; i <= n; ++i ) member.push_back( Agent(i) ); 我還會寫一個工具函式 address_of 來搭配 std::transform 使 用:       template<typename T> T* address_of( T &obj ) { return &obj; } 再來是初始化 onlyone 的部份:    std::transform( member.begin(), member.end(), std::back_inserter( onlyone ), address_of<Agent> ); 最後程式碼的樣子 → http://codepad.org/QmeTjjLK ──────────────────────────── 柯南當得愈來愈有心得了說... = ˇ = -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (03/16 05:50)
nowar100:大大不來當版主嗎 A___A 03/16 06:57
james732:大大不來當版主嗎 A___A 03/16 10:37
legnaleurc:好版主,不當嗎? 03/16 11:45
jackwei:amazing!.. 你的用心回應雖然我還沒消化完 真的很感謝你 03/16 12:56
jackwei:第2. 的確是我的目的 讓structure內部結構變化之下 03/16 12:57
jackwei:還能簡單按照順序access member裡的Agent 03/16 12:57
jackwei:因為我確定member往後不會再push東西了 03/16 14:04
jackwei:所以"全部push後再一個個取位置"就解決了 謝謝 03/16 14:04