今天學習了下c++的assign()函式。從字面上來說,assign()函式是給容器進行分配新的空間,把新的值拷貝到容器內。恰好發現一篇學習部落格(
該部落格上**如下:
//關於assign的函式的好處,應該很好理解就是在不能使用賦值符「=」的情況下,可以將乙個容器中的部分元素通過迭代器傳遞賦值到另乙個容器中,但是在assign的使用過///程中,有一點需要特別注意,就是呼叫assign()函式的容器必須有足夠的空間來容納複製過來的元素,下面通過例子來說明這一點:
//exercise
//編寫程式將乙個 list 容器的所有元素賦值給乙個vector 容器,其中 list 容器中儲存的是指向 c 風格字串的 char* 指標,而 vector 容器的元素則是 string型別。
**如下:
#include
#include
#include
#include
using namespace std;
int main()
;listclist(ca,ca+4);
list::iterator list_ter=clist.begin();
vectorsvec; //這個地方需要特別注意!!!
vector::iterator ster=svec.begin();
svec.assign(clist.begin(),clist.end());
/* while(ster!=svec.end())
cout<
if(!svec.empty())
else
cout<<"svec is empty!"cout<<*list_ter++<<" ";
cout<
我執行了下該該**,發現該**在執行到
for( ;ster != svec.end(); ster++)
cout<<*ster<<" ";
時出錯。
作者給的解釋時需要給vector重新分配空間,但據我所知,所有的stl容器都有自己的記憶體分配器,需重新分配空間一說太牽強。
隨後,我改下**,在
for( ;ster!=svec.end();ster++)
cout<<*ster<<" ";
前面加上**
for( vector::iterator stertmp = svec.begin();;stertmp != svec.end(); stertmp++)
cout<<*stertmp<<" ";
**成了
#include
#include
#include
#include
using namespace std;
int main()
;listclist(ca,ca+4);
list::iterator list_ter=clist.begin();
vectorsvec; //這個地方需要特別注意!!!
vector::iterator ster=svec.begin();
svec.assign(clist.begin(),clist.end());
/* while(ster!=svec.end())
cout<
if(!svec.empty())
else
cout<<"svec is empty!"cout<<*list_ter++<<" ";
cout<
發現**在for( vector::iterator stertmp = svec.begin();;stertmp != svec.end(); stertmp++)
cout<<*stertmp<<" ";
執行正常。
我懷疑是迭代器本身的問題,於是,又加了一行**,**如下:
#include
#include
#include
#include
using namespace std;
int main()
;listclist(ca,ca+4);
list::iterator list_ter=clist.begin();
vectorsvec; //這個地方需要特別注意!!!
vector::iterator ster=svec.begin();
svec.assign(clist.begin(),clist.end());
/* while(ster!=svec.end())
cout<
if(!svec.empty())
else
cout<<"svec is empty!"cout<<*list_ter++<<" ";
cout<
發現程式執行正常。
仔細分析記憶體,發現迭代器本身有個指標,指向容器的空間。指標在vector::iterator ster=svec.begin(); 處值為空,在第二次賦值時,該指標獲得了相應值。
繼續分析:原來,vector在進行記憶體分配的時候,會把begin()和end()發生變化。原來的迭代器內指標指向為空,現在,容器發生了記憶體的變化,再用原來的迭代器自然會發生記憶體越界。
~
乙個由sizeof引出的有意思的問題
前段時間在乙個論壇上看到了乙個帖子,lz發了乙個 如下。注意,sizeof語句後面沒有加分號。include stdio.h intmain 這個 實在太簡單了,我想大家學c c 時都使用過這個 我們都會這樣去看各種基本資料型別占用了幾個位元組的儲存空間,但是這個敲錯的 卻出現了乙個很詭異的問題 儘...
PhotoCamera引出的乙個問題
使用photocamera做自定義相機頁面時,發現乙個奇怪的現象。最開始是在乙個自定義控制項中管理photocamera,並鏈結到videobrush顯示。需要開啟相機的時候,new乙個控制項,並新增到頁面的框架中顯示。然而後來發現乙個問題,當相機初始化完成後,videobrush只會顯示相機實時畫...
由乙個網域名稱想到的
花了 大價錢 買了乙個網域名稱 zzm.hk,夠短了,其實沒有什麼含義,但沒有其它選擇。這樣的網域名稱,好像只能指向個人部落格站點,或者用qq郵箱體系裡的網域名稱郵箱功能設定乙個如 i zzm.hk 記得給我發郵件 的個人email。記得 phpdragon 以前還註冊過乙個 phpdragon.c...