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个元素的拷贝
如果两个容器长度不同,则重置容器的长度