? ?
C++ Primer 學習札記??
Ma Jia nan
一 順序容器操作之插入(insert)
?
向容器中插入元素有以下幾種形式:
?
1) 最一般的形式:
??
vector<string> svec; ?? list<string> slist;
?? string s( "MaJianan" ); ?? slist.insert( slist.begin(), s ); ?? svec.insert( svec.begin(), s );
|
insert()將第二個參數(要被插入的值)插入到第一個參數(指向容器中某個位置的iterator)指向的位置的前面。
更為隨機的插入操作可以如下實現:
?? string s1( "yuanlaishini" ); ?? list<string>::iterator iter;
?? iter = find( slist.begin(), slist.end(), s1 ); ?? slist.insert( iter, s1 );
|
find()返回被查找元素在容器中的位置,如果查找失敗,返回end()iterator.
???
//slist.push_back( value )等價于???
slist.insert( slist.end(), value );
?
2) 在某個位置插入指定數量的元素.
?? 例如,在vector的開始處插入10個MaJianan:
??
vector<string> svec; ?? string mjn( "MaJianan" );
?? svec.insert( svec.begin(), 10, mjn );
|
?
3)向容器插入一段范圍內的元素:
?string sa[3] = { "MaJianan", "yuanlaishini", "blog.sina.com.cn"};
? ?//插入數組中的全部元素 ?? svec.insert( svec.begin(), sa, sa+3 );
? ?//插入數組中的部分元素 ?? svec.insert( svec.begin() + svec.size()/2, sa+1, sa+3 );??
|
?
4)通過一對iterator來標記帶插入值的范圍,可以是另一個vector
例一: ?? //插入svec中含有的元素,從svec2中間開始 ?? svec2.insert( svec2.begin() + svec2.size()/2, svec.begin(), svec.end() );
?? 例二: ?? //把sevc中的元素插入到slist中sValue的前面 ?? list<string> slist; ?? list<string>::iterator iter = find( slist.begin(), slist.end(), sValue ); ?? slist.insert( iter, svec.begin(), svec.end() );
|
二 順序容器操作之刪除(erase)
1) 刪除單個元素
list<string> slist; ... ... sting sValue( "yuanlaishini" ); list<string>::iterator iter=find( slist.begin(), slist.end(), sValue ); if( iter!=slist.end() ) ????? ?slist.erase( iter );
|
?
2) 刪除有一對iterator標記的一段范圍內的元素
//刪除所有元素 slist.erase( slist.begin(), slist.end() );
//刪除部分元素 例一: slist.erase( slist.begin()+slist.size()/2, slist.end() );
例二: list<string>::iterator first, last; first=find( slist.begin(), slist.end(). value1); last=find( slist.begin(), slist.end(). value2); //檢驗first和last的有效性 slist.erase( first, last );
|
3) 與push_back()相對應,pop_back()刪除容器的末尾元素。
三 順序容器操作之賦值(=)和對換(swap)
//slist1含有8個元素
//slist2含有16個元素
1)如果
slist1 = slist2;
?
? slist1擁有與被拷貝容器相同的元素數目---16.slist2有16個元素,沒有變化。
? slist1中原來的8個元素被刪除(調用string的析構函數)
2)如果 slist1.swap( slist2 );
?
? slist1現在有16個元素,而slist2函數slist1中原有的8個元素的拷貝
? 如果兩個容器長度不同,則重置容器的長度?
?
?