vector

  vector维护的是一个连续线性空间,所以不论元素型别为何,普通指针也都可以作为vector的迭代器来支持所需要的操作,如operator*, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=。

  如果客户端写出这样的代码:

vector<int>::iterator ivite;

vector<Shape>::iterator svite;

  由ivite的型别就是int*,svite的型别就是Shape*。

  

  为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充,这便是容量(capacity)的观念。换句话说,一个vector的容量永远大于或等于其大小。

  一旦容量等于大小,又要添加新元素时,就要动态增加大小,但是并不是在原空间之后接续新空间(因为不能保证原空间之后沿有可供配置的空间),而是以原大小的两倍另外配置一块空间,然后将原内容拷贝过来,然后才开始构造新元素并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了!

  vector有两个迭代器start和finish分别指向连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(包含备用空间)的尾端。

  使用begin()和end()可以获取已被使用的头、尾迭代器(注意STL的“前闭后开”的区间要求)。

  使用size()获取已经使用的元素个数,使用capacity()可获取容量(包含备用空间在内,可以存储的元素个数)。

  使用push_back()或insert()添加元素,pop_back()或erase()移除元素,clear()清空所有元素。

  添加元素的过程相对比较复杂,因为考虑到动态增加空间。移除元素时就简单一些,而且移除元素后不会缩小vector的容量。

  三个移除元素的函数如下:

	void pop_back() {
		--finish;		// finish是前面说过的指向已使用空间尾部的迭代器
		destroy(finish);	// destroy是全局函数
	}
	iterator erase( iterator first, iterator last) {
		iterator i = copy(last, finish, first);		// copy是全局函数
		destroy(i, finish);
		finish = finish - (last - first);
		return first;
	}
	iterator erase(iterator position) {
		if(position + 1 != end())
			copy(position + 1, finish, position);
		--finish;
		destroy(finish);
		return position;
	}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值