C++ STL vector(向量容器)的使用(附完整程序代码)
一、简单介绍
Vectors 包括着一系列连续存储的元素,其行为和数组类似。
訪问Vector中的随意元素或从末尾加入元素都能够在O(1)内完毕,而查找特定值的元素所处的位置或是在Vector中插入元素则是O(N)。
| Constructors | 构造函数 |
| Operators | 对vector进行赋值或比較 |
| assign() | 对Vector中的元素赋值 |
| at() | 返回指定位置的元素 |
| back() | 返回最末一个元素 |
| begin() | 返回第一个元素的迭代器 |
| capacity() | 返回vector所能容纳的元素数量(在不又一次分配内存的情况下) |
| clear() | 清空全部元素 |
| empty() | 推断Vector是否为空(返回true时为空) |
| end() | 返回最末元素的迭代器(译注:实指向最末元素的下一个位置) |
| erase() | 删除指定元素 |
| front() | 返回第一个元素 |
| get_allocator() | 返回vector的内存分配器 |
| insert() | 插入元素到Vector中 |
| max_size() | 返回Vector所能容纳元素的最大数量(上限) |
| pop_back() | 移除最后一个元素 |
| push_back() | 在Vector最后加入一个元素 |
| rbegin() | 返回Vector尾部的逆迭代器 |
| rend() | 返回Vector起始的逆迭代器 |
| reserve() | 设置Vector最小的元素容纳数量 |
| resize() | 改变Vector元素数量的大小 |
| size() | 返回Vector元素数量的大小 |
| swap() | 交换两个Vector |
二、完整程序代码
/*请务必执行下面程序后对比阅读*/ #include <vector>
#include <iostream>
#include <algorithm>
#include <stdexcept>
using namespace std; void print(int num)
{
cout << num << " ";
} int main()
{
//1. 初始化
vector<int> v;
vector<int>::iterator iv; v.reserve(100);//设置vector最小的元素容纳数量
v.assign(10, 2);//将10个值为2的元素赋到vector中
cout << v.capacity() << endl; //返回vector所能容纳的元素数量(在不又一次分配内存的情况下)
cout << v.size() << endl; //返回Vector实际含有的元素数量
cout << endl; //2. 加入
//注意:push_front()仅仅适用于list和deque容器类型
for (int i = 0; i < 10; i++)
v.push_back(i);
for_each(v.begin(), v.end(), print);//须要#include <algorithm>
cout << endl;
cout << v.size() << endl;
cout << endl; //3. 插入及遍历、逆遍历
v.insert(v.begin() + 3, 99);
v.insert(v.end() - 3, 99);
for_each(v.begin(), v.end(), print);
cout << endl;
for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素
cout << endl; //一般遍历写法
for(iv = v.begin(); iv != v.end(); ++iv)
cout << *iv << " ";
cout << endl;
cout << endl; //4. 删除
v.erase(v.begin() + 3);
for_each(v.begin(), v.end(), print);
cout << endl;
v.insert(v.begin() + 3, 99);//还原 v.erase(v.begin(), v.begin() + 3); //注意删除了3个元素而不是4个
for_each(v.begin(), v.end(), print);
cout << endl; //注意:pop_front()仅仅适用于list和deque容器类型
v.pop_back();
for_each(v.begin(), v.end(), print);
cout << endl;
cout << endl; //5. 查询
cout << v.front() << endl;
cout << v.back() << endl; //危急的做法,但一般我们就像訪问数组那样操作即可
for (int i = 15; i < 25; i++)
cout << "Element " << i << " is " << v[i] << endl;
//安全的做法
int i;
try
{
for (i = 15; i < 25; i++)
cout << "Element " << i << " is " << v.at(i) << endl;
}
catch (out_of_range err)//#include <stdexcept>
{
cout << "out_of_range at " << i << endl;
}
cout << endl; //6. 清空
v.clear();
cout << v.size() << endl;//0
for_each(v.begin(), v.end(), print); //已经clear。v.begin()==v.end()。不会有不论什么结果。 return 0;
}
三、补充
vector应该说是在STL中使用最广泛的容器。
大家知道。数组是差点儿每一种语言都拥有的底层数据结构,但在我们的工作中,我们会大量的使用数组来表示同一类事物的一个集合。而vector实质上就是一个能够存储不论什么元素的动态数组。
vector尽管不是一个低级的数据结构,可是它各个操作的效率差点儿是和数组同样的。仅仅是它会使用比普通数组很多其它的空间。由于在vector由于空间不足而须要又一次分配空间的时候。它通常会分配很多其它的空间(可能是当前size的1.5倍,这个是由详细实现定义的),以免每次插入一个新的元素的时候,都会又一次分配空间。
又一次分配空间是vector里面最没有效率的操作,所以在使用vector的时候要尽量避免又一次分配空间。详细的方法是依据自己的实际须要来设定vector的capacity大小。
关于vector与list的具体比較。请參考这篇文章。
C++ STL vector(向量容器)的使用(附完整程序代码)的更多相关文章
- C++STL之vector向量容器
vector向量容器 vector向量容器不但能向数组一样对元素进行随机访问, 还能在尾部插入元素 vector具有内存自动管理的功能, 对于元素的插入和删除, 可动态调整所占的内存空间 vect ...
- vector向量容器(常用的使用方法总结)
关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍. vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插 ...
- 标准模板库使用参考——vector向量容器
C++的STL从广义上讲分为algorithm(算法),container(容器)和iterator(迭代器)三类,包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法. 在C++标准库中,ST ...
- 学习笔记之vector向量容器
今天复习到vector向量容器,里面包括vector向量容器的一些优点以及具体的使用方法及代码,分享给大家. Vector向量容器不但能够像数组一样对元素进行随机访问,还可以在尾部插入元素,是一种简单 ...
- vector向量容器
vector向量容器不但可以像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单高效的容器,可以代替数组. vector具有内存自动管理的功能,对于元素的插入和删除,可以动态的调整所占内存. ...
- vector向量容器元素排序与查找
1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...
- vector 向量容器用法祥解
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: ...
- 利用copy函数简单快速输出/保存vector向量容器中的数据
如果要输出vector中的数据我们可以通过循环语句输出,更加简便的方法是利用copy函数直接输出,例子: #include "stdafx.h" #include <iost ...
- STL --> vector向量
vector向量 vector是一种对象实体,能够容纳许多其他类型相同的元素,因为又被称为容器. 头文件 在使用它时,需要包含头文件 <vector>. #include <vect ...
随机推荐
- struts笔记
Struts视频笔记: Struts是一个开源的web框架,框架提高了程序的规范的同时也约束了程序员的自由 为什么会有struts: 因为我们队mvc理解的不同,可能造成不同公司写程序的时候,规范不统 ...
- Lintcode: Unique Paths
C++ dp 递推式:dp[i][j] = dp[i-1][j] + dp[i][j-1] 初值:dp[i][j] = 1,i=0 or j=0 空间优化:省掉一维 class Solution { ...
- IIS 之 IIS 7及以上多域名或端口绑定同一物理目录并设置不同默认文档
今天在 IIS 7 多端口或域名绑定同一物理目录,设置不同的默认文档遇到问题:同一物理目录的多个站点修改任意一个站点默认文档都会一起更改. 原因:在同一个物理目录下只有一个 web.config,并且 ...
- Unix线程概念、控制原语、属性
线程: 线程基础概念: 线程在Linux中又称轻量级进程.而且它和进程都有PCB(进程控制块).可是差别是进程的虚拟地址空间是独享的,也就是每一个进程都有自己的虚拟地址空间.可是线程的PCB是共享的, ...
- CyclicBarrier的用法
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待, ...
- java笔记整理
Java 笔记整理 包含内容 Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...
- FTP在CentOS上安装与使用
安装: yum install -y vsftpd 相关配置文件: /etc/vsftpd/vsftpd.conf //主配置文件,核心配置文件 /etc/vsftpd/ftpusers //黑名单, ...
- appium架构分析
http://blog.sina.com.cn/s/blog_60c53af50102v3sb.html Appium - automation for mobile apps 一.Appium架 ...
- 微信小程序解决方案合集
微信小程序解决方案合集:http://www.wxapp-union.com/special/solution.html 跳坑系列:http://www.wxapp-union.com/forum.p ...
- Dynamics CRM 2015 Update 1 系列(4): 自己定义主键 - Alternate Keys
Alternate Keys. 还是和系统集成相关的一个重量级Feature.使用该Feature能极大的提高开发数据集成接口的时间成本以及接口的执行效率. 在之前的Dynamics CRM 版本号中 ...