步步为营(九)常用数据结构(2)STL-Vector(动态数组)

和链表相对的就是数组了,这两种结构是最基本的数据结构类型了。
C++自身实现了一个array容器,但是STL里的动态数组Vector(直译为向量)使用更方便,这里还是讨论下Vector。

Vector是内存连续的,空间按需增长的结构。

Vector和List是刚好相反的,Vector在随机存储的操作上非常方便,但是在增加和删除元素时非常麻烦。如果你想删除一个元素,就必须移动后面所有的元素向前一位,如果删除和增加的操作比较多,那么消耗的时间是很恐怖的。

Vector的空间分配是这样的:如果当前的空间不够储存,则把当前空间扩大一倍使用。如果扩大一倍之后还不够,就继续扩大到需要的大小。
也就是说,如果当前Vector的空间为200,你一次插入300个数据,那么空间的演变就是:200->400->800;
这种分配方式导致在特殊情况下,Vector对于内存消耗会特别大,所以对于Vector的空间分配一定要进行预估,防止出现内存倍增的情况。
使用vector时,推荐用reserve()成员函数预先分配需要的内存空间,它既可以保护迭代器使之不会失效,又可以提高运行效率。

下面附上Vector成员函数说明:

vector<Elem> c     创建一个空的vector。

vector <Elem> c1(c2)     复制一个vector。

vector <Elem> c(n)     创建一个vector,含有n个数据,数据均已缺省构造产生。

vector <Elem> c(n, elem)     创建一个含有n个elem拷贝的vector。

vector <Elem> c(beg,end)     创建一个以[beg;end)区间的vector。。

~ vector <Elem>()     销毁所有数据,释放内存。


operator[]  返回容器中指定位置的一个引用。


assign(beg,end)    将[beg; end)区间中的数据赋值给c。

assign(n,elem)    将n个elem的拷贝赋值给c。

at(idx)    传回索引idx所指的数据,如果idx越界,抛出out_of_range。

back()    传回最后一个数据,不检查这个数据是否存在。

begin()    传回迭代器重的可一个数据。

capacity()    返回容器中数据内存大小。

clear()    移除容器中所有数据。

empty()    判断容器是否为空。

end()    指向迭代器中的最后一个数据地址。

erase(pos)     删除pos位置的数据,传回下一个数据的位置。

erase(beg,end)     删除[beg,end)区间的数据,传回下一个数据的位置。

front()    传回第一个数据。

get_allocator    使用构造函数返回一个拷贝。

insert(pos,elem)    在pos位置插入一个elem拷贝,传回新数据位置。

insert(pos,n,elem)    在pos位置插入n个elem数据。无返回值。

insert(pos,beg,end)    在pos位置插入在[beg,end)区间的数据。无返回值。

max_size()    返回容器中最大数据的数量。

pop_back()   删除最后一个数据。

push_back(elem)    在尾部加入一个数据。

rbegin()    传回一个逆向队列的第一个数据。

rend()    传回一个逆向队列的最后一个数据的下一个位置。

resize(num)    重新指定队列的长度。

reserve()    保留适当的容量。

size()    返回容器中实际数据的个数。

swap(c1,c2)    将c1和c2元素互换。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值