步步为营(九)常用数据结构(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成员函数说明:
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元素互换。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(七):数据结构详解
- Lua教程(二):C++和Lua相互传递数据示例
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例