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 ...
随机推荐
- Office办公 如何设置WPS的默认背景大小
设计-页面设置,然后修改宽度和高度 因为我们只是需要背景跟平面差不多大(不同屏幕比如宽屏的就比较长),修改宽度和高度的时候注意文字之类的也会被拉伸缩放,所以自己改了之后看效果,比如我100,50的 ...
- iOS 真机上图标不显示
今天在调试时发现模拟器上图标显示了.但真机上测试时发现图标不显示. 解决办法 57*57 的图标然后命名为: Icon.png 这样显示就正常了. 参考资料:http://www.cnblogs.c ...
- C# list与数组互相转换
1,从System.String[]转到List<System.String>System.String[] str={"str","string" ...
- Java中创建访问HTTPS的自签名证书的方法
一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随 ...
- GCC中的内嵌汇编语言
原文可参考:GCC中的内嵌汇编语言 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的.有些汇编语言代码是直接写在汇编源程序中的,特别是Li ...
- Can't connect to MySQL server on 'ip' (13)
解决方法1.:setsebool -P httpd_can_network_connect_db=1 解决方法2.:修改/etc/selinux/config SELINUX=enforcing 为 ...
- linux下切换python2和python3(转)
0x00 为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发.Lin ...
- 常见pip方法
pip search 包名 查询 pip install 包名 安装包 pip show--files 包名 pip list --outdated 检查哪些包需要更新 pip insta ...
- XmanagerEnterprise-6.0.0092-beat内测版|免费使用
xshell很还好用,目前发布beat6.0免费注册.免费使用... 00.安装 11.扁平化的UI download: 链接: https://pan.baidu.com/s/1qXTjjAG 密码 ...
- GNU Linux系统变量(sysctl配置命令)综合使用
查看全部kernel变量的值 sysctl -a 怎样查看一个系统变量的值 1).cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 2).s ...