您的位置:首页 > 理论基础 > 数据结构算法

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

2015-07-28 10:21 351 查看
和链表相对的就是数组了,这两种结构是最基本的数据结构类型了。

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元素互换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 stl c++