vector向量容器
vector向量容器不但能向数组一样对元素进行随机访问, 还能在尾部插入元素
vector具有内存自动管理的功能, 对于元素的插入和删除, 可动态调整所占的内存空间
vector容器的下标是从0开始计数的, 也就是说, 如果vector容器的大小是n, 那么, 元素的下标是0~n-1
对于vector容器的容量定义, 可以事先定义一个固定的大小, 事后, 可以随时调整其大小;
也可以事先不定义, 随时使用push_back()方法从尾部扩张元素, 也可以使用insert()在某个元素位置前插入新元素
vector容器有两个重要的方法, begin()和end().
begin()返回的是首元素位置的迭代器
end()返回的是最后一个元素的下一个元素位置的迭代器
1.1创建vector对象
(1)不指定容器的元素个数, 如定义一个用来存储整型的容器:
vector<int> v;
(2)创建时, 指定容器的大小, 如定义一个用来存储10个double类型元素的向量容器
vector<double> v(10);
注意, 元素的下标为0~9; 另外, 每个元素的值被初始化为0.0
(3)创建一个具有n个元素的向量容器对象, 每个元素具有指定的初始值:
vector<double> v(10, 8.6)
上述语句定义了v向量容器, 共有10个元素, 每个元素的值是8.6
1.2尾部元素扩张
尾部追加元素, vector容器会自动分配新内存空间, 可对空的vector对象扩张, 也可对已有元素的vector对象扩张
下面代码将2,7,9三个元素从尾部添加到v容器中, 这样, v容器中就有了三个元素, 其值依次是2,7,9
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(2);
v.push_back(7);
v.push_back(9);
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
1.3下标方式访问vector元素
对于vector对象, 可以采用下标方式随意访问它的某个元素, 当然, 也可以以下标的方式对某元素重新赋值, 这点类似于数组的访问方式
下面的代码就是采用下标方式对数组赋值, 再输出元素的值2,7,9:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
cout << v[0] << " " << v[1] << " " << v[2] << endl;
return 0;
}
1.4用迭代器访问vector元素
常使用迭代器配合循环语句来对vector对象进行遍历访问, 迭代器的类型一定要与它要遍历的vector对象的元素类型一致
下面的代码采用迭代器对vector进行了遍历, 输出2,7,9:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
//定义迭代器变量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//输出迭代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.5元素的插入
insert()方法可以在vector对象的任意位置前插入一个新的元素, 同时, vector自动扩张一个元素空间, 插入位置后的所有元素依次向后挪动一个位置
要注意的是, insert()方法要求插入的位置, 是元素的迭代器位置, 而不是元素的下标
下面的代码输出结果是: 8,2,1,7,9,3:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
//在最前面插入新元素, 元素值为8
v.insert(v.begin(), 8);
//在第2个元素前面插入新元素1
v.insert(v.begin() + 2, 1);
//在向量末尾追加新元素3
v.insert(v.end(), 3);
//定义迭代器变量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//输出迭代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.6元素的删除
erase()方法可以删除vector中迭代器所指的一个元素或一段区间中的所有元素
clear()方法则可以一次性删除vector中的所有元素
下面这段代码演示了vector元素的删除方法:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10);
//给向量赋值
for(int i = 0; i < 10; i++)
{
v[i] = i;
}
//删除2号元素, 从0开始计数
v.erase(v.begin() + 2);
//定义迭代器变量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//输出迭代器上的元素值
cout << *it << " ";
}
cout << endl;
//清空向量
v.clear();
//输出向量大小
cout << v.size() << endl;
return 0;
}
1.7使用reverse反向排列算法
reverse 反向排列算法, 需要定义头文件"#include<algorithm>", 可将向量中某段迭代器区间元素反向排列, 看下面这段代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v(10);
//给向量赋值
for(int i = 0; i < 10; ++i)
{
v[i] = i;
}
//反向排列向量的从首到尾的元素
reverse(v.begin(), v.end());
//定义迭代器变量
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
//输出迭代器上的元素值
cout << *it << " ";
}
cout << endl;
return 0;
}
1.8使用sort算法对向量元素排序
使用sort算法, 需要声明"include<algorithm>"头文件
sort算法要求使用随机访问迭代器进行排序, 在默认的情况下, 对向量元素进行升序排列, 下面这个程序很好的说明了sort算法的使用方法:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
int i;
//赋值
for(i = 0; i < 10; ++i)
{
v.push_back(9 - i);
}
//输出排序前的元素值
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
//排序, 升序排列
sort(v.begin(), v.end());
//输出排序后的元素值
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
return 0;
}
还可以自己设定排序比较函数, 然后, 把这个函数指定给sort算法, 那么, sort就根据这个比较函数指定的排序规则进行排序, 下面的程序自己设计了一个排序比较函数Comp, 要求对元素的值由大到小排序:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//自己设计的排序比较函数, 对元素的值进行降序排列
bool Comp(const int &a, const int &b)
{
if(a != b)
return a > b;
else
return a > b;
}
int main()
{
vector<int> v;
int i;
for(i = 0; i < 10; ++i)
{
v.push_back(i);
}
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
sort(v.begin(), v.end(), Comp);
for(i = 0; i < 10; ++i)
{
cout << v[i] << " ";
}
cout << endl;
return 0;
}
1.9向量的大小
使用size()方法可以返回相连的大小, 即元素的个数
使用empty()方法可以返回向量是否为空
下面这段代码演示了size()方法和empty()方法的用法:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v(10);
for(int i = 0; i < 10; ++i)
{
v[i] = i;
}
cout << v.size() << endl; //元素的个数
cout << v.empty() << endl; //非空为0
v.clear();
cout << v.empty() << endl; //空为1
return 0;
}
/*
10
0
1
*/
另外, 向量的类型可以是int, double, char等简单类型, 也可以是结构体或string基本字符序列容器, 使用起来非常灵活.
- 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++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: ...
- C++STL之Vector向量详解,用法和例子 一起学习 一起加油
C++ STL之vector用法总结 1 ...
- 利用copy函数简单快速输出/保存vector向量容器中的数据
如果要输出vector中的数据我们可以通过循环语句输出,更加简便的方法是利用copy函数直接输出,例子: #include "stdafx.h" #include <iost ...
- C++ STL vector(向量容器)的使用(附完整程序代码)
一.简单介绍 Vectors 包括着一系列连续存储的元素,其行为和数组类似. 訪问Vector中的随意元素或从末尾加入元素都能够在O(1)内完毕,而查找特定值的元素所处的位置或是在Vector中插入元 ...
随机推荐
- uva 133解题报告
题目描述 为了缩短领救济品的队伍,NNGLRP决定了以下策略:每天所有来申请救济品的人会被放在一个大圆圈,面朝里面.选定一个人为编号 1 号,其他的就从那个人开始逆时针开始编号直到 N.一个官员一开始 ...
- /proc下重要路径知识
/proc 虚拟目录,是内存的映射,内核与进程的虚拟文件系统目录/proc/version 内核版本/proc/sys/kernel 系统内核功能/proc/sys/net/ipv4*/proc/cp ...
- python学习3(转载)
主要内容: 列表 和 元组和字典 列表 一.列表介绍 列表是一种能存储大量数据的数据结构,是能装对象的对象.由方括号 [] 括起来,能放任意类型的数据,数据之间用逗号隔开 列表存储数据是有顺序的 二. ...
- 浅谈APP消息推送
作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用 ...
- eclipse中使用git下载项目
准备工作: 目的:从远程仓库github上down所需的项目 eclipse使用git插件下载github上项目 eclipse版本:eclipse4.5 64位 jdk版本:jdk-1.7 64位 ...
- 阿里云主机windows系统Apache启用浏览器缓存的方法
一群友使用卡卡网的网站速度诊断工具诊断网站速度时,发现有几个需要优化的地方,其中较为重要的是“启用浏览器缓存”.诊断结果显示,网站尚未启用浏览器缓存. 图一:浏览器缓存未启用 群友找我帮忙设置一下,据 ...
- Windows Server 2012 R2
Windows Server 2012 R2 历史上的Server有2003 server, 2008 server, 2012 server windows server 2012 r2对计算机的消 ...
- 使用dtd--属性声明
<!ATTLIST 元素名 属性名称 属性类型 属性特点> 1.属性类型 类型 含义 CDATA 纯文本 enumerated 枚举类型 ID 以属性的方式唯一标识改元素,必须以字母开头 ...
- JS的函数参数传递为值传递
function setAge(i) { alert(i);//24 i = 18; alert(i);//18,i的改变不会影响外面的age }; var age = 24; setAge(age) ...
- 零基础逆向工程34_Win32_08_线程控制_CONTEXT结构
线程控制 实验 挂起线程 ::SuspendThread(hThread); 恢复线程 ::ResumeThread(hThread); 终止线程 (这里讲了同步调用与异步调用) 方式一: 此方法结束 ...