Re: [問題] vector中含自創class的pointer

看板C_and_CPP (C/C++)作者 (朴髮箍)時間15年前 (2011/03/16 05:38), 編輯推噓5(503)
留言8則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《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)

03/16 06:57, , 1F
大大不來當版主嗎 A___A
03/16 06:57, 1F

03/16 10:37, , 2F
大大不來當版主嗎 A___A
03/16 10:37, 2F

03/16 11:45, , 3F
好版主,不當嗎?
03/16 11:45, 3F

03/16 12:56, , 4F
amazing!.. 你的用心回應雖然我還沒消化完 真的很感謝你
03/16 12:56, 4F

03/16 12:57, , 5F
第2. 的確是我的目的 讓structure內部結構變化之下
03/16 12:57, 5F

03/16 12:57, , 6F
還能簡單按照順序access member裡的Agent
03/16 12:57, 6F

03/16 14:04, , 7F
因為我確定member往後不會再push東西了
03/16 14:04, 7F

03/16 14:04, , 8F
所以"全部push後再一個個取位置"就解決了 謝謝
03/16 14:04, 8F
文章代碼(AID): #1DVznHam (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DVznHam (C_and_CPP)