C++_vector

对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 happens
  • else{ vec.capacity() = x} it won’t modify vec.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);!! ' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值