作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] vector中含自創class的pointer
時間Wed Mar 16 05:38:21 2011
※ 引述《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