Vector List
构造函数可以初始化顺序容器的大小(size t) , t 可以指定顺序容器的capacity。第二个参数可以指定容器的默认值。
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。
两个函数的参数形式也有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小, 第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。
顺序容器的比较符运算
等于是比较容器的size和各个位置元素是否相等,不等反之
大于,小于是从两容器第一个元素开始比较第一个不相等的元素
如
v1{1,2,3,4,5}
v2{1,2,5,7,8}
则v1 < v2 == true(3 < 5)
如果元素相等,那么比较容器的长度
用户自定义类需要重载等于,小于,和支持缺省值 才能使用比较运算
遍历顺序容器
对于参数是const 类型的vector 或者 list
遍历const容器必须使用const iterator.例如
void even_odd( const vector<int> *pvec,vector<int> *pvec_even,vector<int> *pvec_odd )
{
// 必须声明一个const_iterator, 才能够遍历pvecvector<int>::const_iterator c_iter = pvec->begin();vector<int>::const_iterator c_iter_end = pvec->end();for ( ; c_iter != c_iter_end; ++c_iter )if ( *c_iter % 2 )pvec_odd->push_back( *c_iter );else pvec_even->push_back( *c_iter );
}
iterator算术运算(只对vector和deque有用)
+,- 移位
容器可以使用一个已经存在的容器的两个iterator(起始和结尾)来初始化。
// 用svec 的全部元素初始化svec2
vector<string> svec2( svec.begin(), svec.end() );
// 用svec 的前半部分初始化svec3
vector<string>::iterator it =
svec.begin() + svec.size()/2;
vector<string> svec3( svec.begin(), it );
练习
const vector< int > ivec;
vector< string > svec;
list< int > ilist;
(a) vector<int>::iterator it = ivec.begin(); //ivec是const类型,所以要用const_iterator
(b) list<int>::iterator it = ilist.begin()+2; // list类型的iterator不能使用算术运算符
(c) vector<string>::iterator it = &svec[0]; //没有这样的用法
(d) for ( vector<string>::iterator it = svec.begin(); it != 0; ++it ) //!=运算符没有用于数字的重载
顺序容器的操作
插入操作
push_back函数是在顺序容器尾部插入一个元素,在容器的其他位置插入元素就需要用到insert函数了
vector< string > svec;
list< string > slist;
slist.insert( slist.begin(), spouse ); //在头部插入一个spouse元素
//在某个元素前插入
string son( "Danny" );
list<string>::iterator iter;
iter = find( slist.begin(), slist.end(), son ); //第一次出现的iterator
slist.insert( iter, spouse );
//插入多次某元素
vector<string> svec;
...
string anna( "Anna" );
svec.insert( svec.begin(), 10, anna ); // 在开头插入10次anna
//插入一定范围的元素(范围可以使用iterator表示)
string sarray[4] = { "quasi", "simba", "frollo", "scar" };
svec.insert( svec.begin(), sarray, sarray+4 );
svec.insert( svec.begin() + svec.size()/2,sarray+2, sarray+4); // 在svec中间插入sarray[2],sarray[3] (4-2)个 元素
svec.insert( svec.begin() + svec.size()/2,s.begin(), s.end());
删除操作
删除元素用erase方法,删除末元素使用pop_back 方法
erase可以删除一个或一个范围的元素
参数可以一个元素的iterator(通过find函数找到)
可以是一个范围如a.erase(a.begin(),a.end())
赋值操作
左操作数的每一个元素都会调用该类型的赋值操作符进行赋值操作把右操作数的所有元素拷贝到左操作数
slist1,slist2,slist1元素个数少于slist2
slist1 = slist2;// slist1的所有元素被调用析构函数,然后slist2的所有元素拷贝到slist1
slist1.swap( slist2 ); //交换两个容器的元素