介绍:

1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同。

2.vector 采用的是连续动态的空间来存储数据,它是动态的数组,它不仅可以使用下标访问每一个位置的数据,还可以对它的长度进行改变,十分的灵活。但是它的灵活也是有代价的,我们都知道,数组在内存中的长度是开始声明的时候就已经确定好了,要改变长度,就意味着需要重新的去申请空间,再将需要的元素移动到这个空间中,在释放原来的空间,但是 vector 对内存的处理或许并不是这样的,无论我们加多少个值或是删除多少个值来改变 vector 的 size,vector 的头地址始终是不变的,这可能和它的内部实现有关,在这里我也不追究了。

3.vector 同时也有许多的函数方法可以调用,方便我们的数据处理以及内存空间的管理。

4.vector 与其他的序列容器相比 (list, forward_lists, deque 等),vector 适合于随机的访问元素,在需要很多随机增删操作的情况下,或许 vector 就没有那么的好用了。

5.vector 在大多数的情况下还是作为动态来使用,一般用来求解线性的题目。

主要的函数方法以及实例化:

首先需要包含头文件 <vector>

实例化一个 vector:因为 vector 是一个模板类,在实例化的同时我们需要给出数据类型。如:

std::vector<int>v1;//实例化一个存放 int 型数据的 vector,其 size() 为 0,初始值为 0;

std::vector<int>v2(5,1);//实例化一个 size() 为 5 的 vector,且数据的初始值为 1;

std::vector<int>v3(v2);//实例化一个与 v2 相同的 vector,而且可以使用迭代器或数值来确定一个范围。

std::vector<int>v3 = v2;//同上

如果代码中包含了 using namespace std; 则可以不写 std:: 前缀。

1.访问元素操作:

  • 下标访问:v2[3], v3[4], v1[5];//其中 v1[5] 是错误的,因为下标越界了。
  • 使用 at():v2.at(0), v3.at(5);//虽然 v3.at(5) 是错误的,但是会抛出异常。
  • 访问头元素:v2.front();//返回值 int
  • 访问最后一个元素:v3.back();//返回值 int
  • 返回一个指针:int* p = v1.data();//返回一个指向这个数组的指针

2.容量操作:

  • vector 大小:v1.size();//返回 v1 的大小
  • vector 最大容量:v2.max_size();//返回 vector 的最大容量
  • vector 的真实大小:v3.capacity();//返回 v3 在内存中的真实大小
  • 改变 vector 的大小:v1.resize(int);//重新定义 v1 大小
  • 判断 vector 是否为空:v1.empty();//返回一个 bool 值
  • 把 vector 的大小减少到元素存储空间的大小:v2.shrink_to_fit();//使用 shrink_to_fit() 会释放内存,而 erase() 和 clear() 不会释放内存,可以减少内存的占用。

3.修改操作:

  • 末尾添加元素:v1.push_back(val);//返回空值
  • 末尾删除元素:v1.pop_back();//返回空值
  • 任意位置插入元素:v2.insert(val);//可以是一个范围,返回值为一个迭代器
  • 任意位置删除元素:v2.erase();//可以是一个范围或是一个位置,返回值为一个迭代器
  • 交换两个 vector 里的元素:v3.swap(v2);//返回空值
  • 多个元素赋值:v1.assign(5,3);//用于初始化 vector,表示 v1 初始化为 5 个值为 3 的元素;
  • 清空 vector:v3.clear();//返回空值
  • 末尾添加元素:v1.emplace_back();//相等于 push_back(),但比它更有效率(C++11)
  • 任意位置插入元素:v1.emplace();//相等于 insert(),但比它更有效率(C++11)

emplace_back() 能够通过参数构造对象,不需要拷贝或者移动内存,相比于 push_back() 能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。由此,在大多数情况下应该优先使用 emplace_back() 来代替 push_back()。

4.迭代器:

  • 开始位置:v1.begin();
  • 末尾位置:v1.end();
  • 指向常量的开始位置:v1.cbegin();//意思是不能通过这个迭代器来修改所指的内容(C++11)
  • 指向常量的末尾位置:v1.cend()://但可以通过其他方式修改的,而且迭代器也是可以移动的(C++11)

5.常用算法:

翻转 vector:reverse(v1.begin(),v1.end());

对 vector 进行排序:sort(v1.begin(),v1.end());//从小到大

sort(v1.begin(),v1.end(),Comp);//从大到小

copy(v1.begin(),v1.end(),v2.begin()+1);//把从 v1[0] 到 v1[size()-1] 的数据复制到 v2[1] 中

find(v1.begin(),v1.end(),10);//在 v1[0] 到 v1[size()-1] 中寻找值为 10 的数

几个函数调用的实例:

v1.assign(v2.begin(),v2.begin()+3);
v1.assign(5,3);
v1.front();
v1.back();
vector<int>::iterator=v1.begin();
vector<int>::iterator=v1.end();
v1.at(3);
v1.empty();
v1.clear();
v1.push_back(5);
v1.emplace_back(5);
v1.insert(v1.begin()+1,5);//在v1的第一个位置插入值为5的数据
v1.insert(v1.begin()+1,3,5);//在v1的第一个位置插入3个值为5的数据
v1.insert(v1.begin()+1,v2.begin(),v2.end());//在v1的第一个位置插入v2
v1.emplace(v1.begin(),5);//在v1的头部插入值为5的数据
v1.pop_back();
v1.erase(v1.begin()+3);
v1.erase(v1.begin()+1,v1.begin()+3);
v1.size(5);
v1.resize(10);
v1.resize(10,6);//假如v1原来为{1,2,3,4,5},执行代码后为{1,2,3,4,5,6,6,6,6,6}
v1.capacity();
v1.swap(v2);
v1==v2;
v1=v2;
v1>v2;
v1<v2;
v1[4];
sort(v1.begin(),v1.end());
reverse(v1.begin(),v1.end());
copy(v1.begin(),v1.end(),v2.begin()+1);
find(v1.begin(),v1.end(),10);

提醒一下:迭代器 v1.begin() 到 v1.end() 的范围是 v1[0] 到 v1[v1.size()-1]。例如假设:v1.size()=5,则 v1.begin() 到 v1.end() 的范围是  v1[0] 到 v1[4],它是一个左闭右开的区间。

【总集】C++ STL类库 vector 使用方法的更多相关文章

  1. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  2. C++Vector使用方法

    C++内置的数组支持容器的机制,可是它不支持容器抽象的语义.要解决此问题我们自己实现这种类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用须要的头文 ...

  3. STL中的nth_element()方法的使用

    STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...

  4. C++STL之Vector向量详解,用法和例子 一起学习 一起加油

                                                                                    C++ STL之vector用法总结 1 ...

  5. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  6. C++-STL:vector用法总结

    目录 简介 用法 1. 头文件 2. vector的声明及初始化 3. vector基本操作 简介 vector,是同一类型的对象的集合,这一集合可看作可变大小的数组,是顺序容器的一种.相比于数组,应 ...

  7. 【C++】STL,vector容器操作

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

  8. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

  9. STL 之 vector 用法

    一.头文件 #include<vector> 二.常用方法: // 在这个向量的尾部插入x的考贝,平均时间为常数,最坏时间为O(n): 1: void push_back(const T& ...

随机推荐

  1. Spring 配置定时器(注解+xml)方式—整理

    一.注解方式 1. 在Spring的配置文件ApplicationContext.xml,首先添加命名空间 xmlns:task="http://www.springframework.or ...

  2. Objective-C分类 (category)和扩展(Extension) 的区别

    http://blog.csdn.net/yhawaii/article/details/6992094 http://blog.163.com/wangy_0223/blog/static/4501 ...

  3. Sublime 设置移动光标快捷键

    发现问题 在使用Sublime和其他编辑器一个很不爽的问题是:在输入一个函数或者有左右的符号或者在引号内时,总是要跳出来,无奈方向键又在主键盘的另一边,只能不断的切换,太特么操蛋,就不能让手指不离开主 ...

  4. 屏蔽系统的Ctrl+c/x/v操作

    实现效果: 知识运用: KeyEventArgs类的Control, public bool Control {get;} //获取一个值 该值指示是否曾按下Ctrl键 KeyCode和Handled ...

  5. PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20)

    PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20)  http://www.patest.cn/contests/pat-b-practise/1033 旧 ...

  6. a标签点击后更改颜色

    function choose(id){ document.getElementById("typeid").value = id; //var infoa=document.ge ...

  7. iptables 过滤字符串

    iptables 过滤字符串 1. 开启iptables iptables -P OUTPUT ACCEPT       ###允许输出链 service iptables save          ...

  8. Bzoj 4720 换教室 (期望DP)

    刚发现Bzoj有Noip的题目,只会换教室这道题..... Bzoj 题面:Bzoj 4720 Luogu题目:P1850 换教室 大概是期望DPNoip极其友好的一道题目,DP不怎么会的我想到了,大 ...

  9. (54)zabbix链接及解除模板链接

    上一节就已经涉及到了链接与解除模板链接(link与unlink),这篇文章除了说明怎么链接模板以外,还会特别讲到一些需要特别注意的细节. HOST链接模板之后,便继承了模板里定义的item,trigg ...

  10. 蓝牙学习(2)USB Adapter

    主要分析一下蓝牙USB Adapter使用USB接口传输HCI包的实现及过程. 参照上面的Bluetooth core system architecture图, 蓝牙USB Adapter作为Blu ...