catalog
对T元素的限制
vector< const T>
是不允许的; 因为, vector需要使用 T的赋值拷贝, 而const元素 只允许初始化, 不允许赋值
vector< [const] T &>
也是不允许的, 同理, &引用元素 只允许初始化, 不允许赋值
vector< [const] T *>
是允许的!!! [const]指针类型, 是可以随机设置 指向的; const的意思是: 不允许修改内容
当然, vector< T * const>
是不允许的!!! 因为: T const *
的意思是: 不允许 修改他的; 即, 和 T &
的意思一样
erase
v.erase( v.begin() +i)
or v.erase( v.begin(), v.end())
it won’t modify capacity()
shrink_to_fit()
v.shrink_to_fit()
v.capacity() = v.size()
remove the extra memory
reserve
vec.reserve( x)
source code
if( x <= vec.capacity())
nothing happenselse{ vec.capacity() = x}
it won’t modifyvec.size()
------------------
VE的初始化
ve的初始化后, size == capacity
!!!
VE<int> A; ' size() == capacity() == 0 '
VE<int> A(n); ' size() == capacity() == n '
VE<int> A{1,2,...,n}; ' size() == capacity() == n '
push_back
push_back
可能 会修改 “capacity”!! (即,当size==capacity
时,会让capacity *= 2
)
VE<int> A(n); ' 此时,size==capacity==n '
A.PB( 1);
' 此时: size() += 1, capacity() *= 2 '
capacity
我们上面说了, PB
可能会导致capacity *= 2
。
而一旦capacity
修改了,会导致: 原先VE的所有元素,重新分配新的地址!!
VE<int> A(n); ' 此时: size()=capacity()=n '
' 假设这n个元素的地址是: [a, a+n) '
A.PB(1);
' 此时: size() = n+1, capacity() = n*2 '
' 新的VE的这(n*2)个元素的地址是: [b, b+n*2) '
即,capacity一旦改变:
- 申请新内存
n * 2
大小 - 将旧内存
n
个元素的值, 深拷贝到,新内存的前n
内存的值 - 释放旧内存
n
个元素
效率非常低!!!
一定要减少,修改capacity
的次数!!!
[] 与 at
当使用[i]
时,VE会退化成数组。
即使i >= size()
,也不会报错!!!(等价于是对一个数组的[]的操作)
而at
,会进行下标判断。
即at(i)
,当i >= size()
时,就会报错。
resize
' 当前VE<T>: size=N,capacity=C。 用A来表示:VE底层的数组 '
resize(n, val);
if( n <= N){
size() = n;
FOR(i, n, N-1, 1) ' 多余的元素,会调用: 析构函数!'
delete A[i];
else{
if( n <= C){
size() = n;
FOR(i, N, n-1, 1)
A[i] = new T(val); ' 如果val未指定,则是默认构造函数 '
}
else{
size() = capacity() = n; ' 由于capacity()改了,会导致(上述讲的,一系列的操作) '
' 但要注意一点: 与PB不同,PB是 capa()*=2,而这里是capa()=n!!! '
FOR(i, N, n-1, 1)
A[i] = new T(val); ' 如果val未指定,则是默认构造函数 '
}
}
resize
会导致: 很多对象的(构造)或(析构)!!
reserve
VE<ST> A;
A.reserve( 10); ' size()==0, capacity()=10 '
注意,reserve
并不会调用10次ST构造!!
, 他是申请了(内存),而不是对象!!
这个函数,对于提高效率(减少 修改capacity的次数),非常有效!
应用
固定长度
如果要构造一个(固定长度)的vector,而且所有值相同
- 如果可以用
memset
,则:VE<int> A(n);
memset( &A[0], 0x3f, A.size() * sizeof(int));
- 否则,
VE<int> A(n, val);
如果要构造一个(固定长度)的vector,而且所有值不同
VE< ST> A;
A.reserve(n);
FOR(i, 0, n-1, 1){
A.push_back( ST(i));
}
以上方式,效率远高于,以下方式:
VE< ST> A(n);
FOR(i, 0, n-1, 1){ A[i] = ST(i); }
' 一共调用了: (n*2)次构造函数!! '
VE< ST> A;
A.resize(n); ' 这种方式,等价于: VE< ST> A(n);!! '