2005年7月25日 星期一

stl 容器的應注意事項

不好意思! 足足一個月沒有交週記!

最近都在忙著脫團作戰,就暫時把Blog 丟到一邊去了。

 

 

最近在用stl 容器時發現一個思路的死角,寫上來分享一下。

 

class A

{

    ...

    std::map<int,int> map_intint;

    ...

}

 

std::vector<A> vec_of_A;

 

這一段是模擬我遇到問題的程式。

它的錯誤等同於 std::vector< std::map<int,int>  > vec_of_map;

std::vector中所有的 std::map 都將無法直接使用。

 

vec_of_A[i].map_intint 會出現無法操作的錯誤!

 

 

依據代號61的不具名同學的多方實驗,

std::vector 會預留 std::map 所需的空間,但是std::map本身並沒有初始化,所以無法操作。

 

於是61提出的解法是:

使用push 及pop之類的函式對 std::vector 做操作,

同時將 class A 的建構子加入  A(&A) 的複製功能,

就無礙地使用容器中的容器。

 

本懶人提出的解法是:

std::vector<A> vec_of_A;  改成 std::vector<A*> vec_of_pA; 

自己做好物件的增減。

 

後面這個方法我用了一年多了,最近哪根筋不對才讓我遇到這bug。

 

 

為何那位61同學不具名呢?  因為他脫團很久了,過著壞人的幸福生活。 因此在這邊對他的貢獻不做任何感謝。

 

 

            我脫團了沒呢?

 

                                        Marty   7.26.2005

 

1 則留言:

  1. 那位不具名的 61 同學的意思是這樣的
    vector 就如同是個籃子
    我們可以跟他說我需要什麼樣的籃子
    然後使用它的 reserve 函式教他準備至少可以放下 N 個東西的大小

    今天假設我需要一個裝蘋果的籃子好了
    然後再跟他說這籃子至少要能裝 10 個蘋果
    如果在這之後我跟他說 "拿第三個蘋果出來" 會怎樣呢?
    自然是沒有蘋果可以拿啊(因為我根本沒放蘋果進去)

    所以才會需要 push 或 insert 這樣放蘋果的動作啊

    回覆刪除