和链表相对的就是数组了,这两种结构是最基本的数据结构类型了。
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元素互换。