由C assign 函式引出的乙個問題

2021-09-30 12:29:22 字數 2579 閱讀 7498

今天學習了下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...