請注意,這裡我所說的動態陣列不是指你自己new 出來的陣列,而是指stl 中的std::vector 和mfc 中的carray 之類的容器。開始以為使用std::vector 不過是免除動態記憶體之苦。免除自己手動開闢和釋放記憶體是一方面,實際上在使用的過程中你會逐漸發現使用std::vector 的好處。今天我就發現了乙個好處。
今天我修改別人寫的乙個影象匹配演算法,所謂影象匹配就是找出兩幅影象中相同的地方,在我這個演算法中就是找出匹配結果點。別人的**大致是這樣的:
/*! \brief 匹配點資訊結構體 */ struct pointinfo }; /*! \brief 匹配兩幅影象,返回匹配結果點陣列 \param pleftimg 左影象檔案控制代碼 \param prightimg 右影象文將控制代碼 \param lvaildnum 返回的匹配結果點個數 \return 匹配結果點陣列 */ pointinfo* imagematch(file* pleftimg,file* prightimg,long &lvaildnum)
說實話我不喜歡這種函式的設計,為什麼呢?因為我覺得為了很好地避免記憶體洩露的話,最好遵循這樣乙個原則:函式外部申請的記憶體函式外部釋放,函式內部申請的內存在函式記憶體釋放,如果像上面的函式設計,使用者往往會忘記釋放 presultpt
的記憶體,而且這種釋放也令人感覺不自然。開始我想這樣改為這樣設計:
/*! \brief 匹配兩幅影象,返回匹配結果點陣列 \param pleftimg 左影象檔案控制代碼 \param prightimg 右影象檔案控制代碼 \param presultpt 輸入的匹配點陣列 \param initptnum 輸入的匹配點陣列的個數 \param lvaildnum 返回的匹配結果點個數 \return 無 */ void imagematch(file* pleftimg,file* prightimg,pointinfo* presultpt,long initptnum,long &lvaildnum)
呼叫這個函式的部分**:
// 呼叫** // 開啟左右影象 file* pleftimg; file* prightimg; long imgwidth = 0; long imgheight= 0; // 獲取左影象寬高,具體**不寫 long initptnum = imgwidth*imgheight; pointinfo* presultpt = new pointinfo[initptnum]; long lvaildnum = 0; imagematch(pleftimg,prightimg,presultpt,initptnum,lvaildnum);
上面的**符合了函式外部申請的記憶體函式外部釋放,函式內部申請的內存在函式記憶體釋放的原則,但是依然給人彆扭的感覺,首先是要找匹配點,先得開乙個整幅圖的大陣列(滿足找匹配點的需要,擔心不夠用),然而匹配點往往只佔影象的一小部分;其次是輸入的函式的引數增多了,除了輸入匹配點陣列指標,還得輸入陣列的難度,輸入引數增多往往增加了使用者的使用難度,比如使用者可能會搞不清楚 long
initptnum
這個引數所代表的意義 。
最後我想比較理想的設計是什麼呢?使用者只需要輸入兩幅影象的檔案控制代碼和動態陣列,呼叫後返回這個陣列就行。於是我想到了下面這個設計:
/*! \brief 匹配兩幅影象 \param pleftimg 左影象檔案控制代碼 \param prightimg 右影象檔案控制代碼 \param vecpt 輸入和匹配點陣列 \return 無 */ void imagematch(file* pleftimg,file* prightimg,std::vector&vecpt)
這樣設計,首先免去開闢和釋放記憶體之累,其次你再也不用開闢一大塊記憶體去應對乙個不確定的情況,三是別人使用起來非常自然。
由此看來,適當使用現成的動態陣列結構可以使我們的設計更為合理。
使用動態陣列結構的乙個好處
請注意,這裡我所說的動態陣列不是指你自己new 出來的陣列,而是指stl 中的std vector 和mfc 中的carray 之類的容器。開始以為使用std vector 不過是免除動態記憶體之苦。免除自己手動開闢和釋放記憶體是一方面,實際上在使用的過程中你會逐漸發現使用std vector 的好...
用乙個屬性儲存乙個動態陣列
用乙個屬性儲存乙個動態陣列,可是弄了半天就是存不下來,象imagelist,等可以動態新增的控制項是如何實現儲存的,用動態陣列能實現嗎?請高手指點 如果不需要在設計時賦值,可以用tlist,tstringlist,tobjectlist儲存,然後宣告屬性及訪問方法,以字串為例 private fli...
乙個動態陣列的例子C
c c 規定,陣列一旦定義後,它的長度就不能改變了 換句話說,陣列容量不能動態地增大或者減小。這樣的陣列稱為 靜態陣列 static array 靜態陣列有時候會給編碼 不便,我們可以通過自定義的 array 類來實現 動態陣列 dynamic array 所謂動態陣列,是指數組容量能夠在使用的過程...