(转) 学习C++ -> 向量(vector)
vector是向量类型,它是一种对象实体,具有值,所以可以看作是变量。 它可以容纳许多其他类型的相同实体,如若干个整数,所以称其为容器。
vector类与一般的Array类的区别在于:
1. vector支持“向现有的数组元素赋值”的概念以及“插入额外元素”的概念--即vector数组可以在运行时动态增长。
2. 代表了更加广泛的应用。它只提供了最小集的操作(如等于、小于操作符, size()、 empty()等操作)。一些通用的操作(如sort()、 min() 、max()和find()等等),则是作为独立的泛型算法提供的。
一、向量的介绍
向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
在使用它时, 需要包含头文件 vector, #include<vector>
vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。
二、向量的声明及初始化
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:
vector<int> a ; //声明一个int型向量a vector<int> a() ; //声明一个初始大小为10的向量 vector<int> a(, ) ; //声明一个初始大小为10且初始值都为1的向量 vector<int> b(a) ; //声明并用向量a初始化向量b vector<int> b(a.begin(), a.begin()+) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
除此之外, 还可以直接使用数组来初始化向量:
int n[] = {, , , , } ; vector<int> a(n, n+) ; //将数组n的前5个元素作为向量a的初值 vector<int> a(&n[], &n[]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
三、元素的输入及访问
元素的输入和访问可以像操作普通的数组那样, 用cin>>进行输入, cout<<a[n]这样进行输出:
示例:
#include<iostream>
#include<vector> using namespace std ;
int main() { vector<int> a(, ) ; //大小为10初值为0的向量a
//对其中部分元素进行输入
cin >>a[] ; cin >>a[] ; cin >>a[] ;
//全部输出
int i ; for(i=; i<a.size(); i++) cout<<a[i]<<" " ;
return ; }
在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。在 vector<int> b(a.begin(), a.begin()+3) ; 这种声明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。(a.begin(), a.end())则表示起始元素和最后一个元素之外的元素位置。
向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
在上例中讲元素全部输出部分的代码就可以改写为:
//全部输出 vector<int>::iterator t ; for(t=a.begin(); t!=a.end(); t++) cout<<*t<<" " ;
*t 为指针的间接访问形式, 意思是访问t所指向的元素值。
四、向量的基本操作
>. a.size() //获取向量中的元素个数 >. a.empty() //判断向量是否为空 >. a.clear() //清空向量中的元素 4>. 复制 a = b ; //将b向量复制到a向量中 5>. 比较 保持 ==、!=、>、>=、<、<= 的惯有含义 ; 如: a == b ; //a向量与b向量比较, 相等则返回1 6>. 插入 - insert ①、 a.insert(a.begin(), 1000); //将1000插入到向量a的起始位置前 ②、 a.insert(a.begin(), 3, ) ; //将1000分别插入到向量元素位置的0-2处(共3个元素) ③、 vector<int> a(, ) ; vector<int> b() ; b.insert(b.begin(), a.begin(), a.end()) ; //将a.begin(), a.end()之间的全部元素插入到b.begin()前 7>. 删除 - erase ①、 b.erase(b.begin()) ; //将起始位置的元素删除 ②、 b.erase(b.begin(), b.begin()+3) ; //将(b.begin(), b.begin()+3)之间的元素删除 8>. 交换 - swap b.swap(a) ; //a向量与b向量进行交换
a.assign(b.begin(), b.begin()+3); //b向量的0~2元素构成向量赋给a
a.assign(4,2); //使a向量只含0~3元素,且赋值为2
int x=a.back(); //将a的最后一个向量元素值赋给整数型变量x
a.clear(); //a向量中元素清空(不再有元素)
if(a.empty()) cout<<"empty"; //a.empty()经常作为条件,判断向量是否为空
int y=a.front(); //将a的第一个向量元素值赋给整型变量y
a.pop_back(); //删除a向量的最后一个元素
a.push_back(5); //在a向量最后插入一个元素,其值为5
a.resize(10); //将向量元素个数调至10个。多则删,少则补,其值随机
a.resize(10,2); //将向量元素个数调至10个。多则删,少则补,其值为2
if(a=b) cout<<"epual"; //向量的比较操作还有 !=, <, <=, >, >=
除此之外,还有元素的插入与删除、保留元素个数、容量观察等操作。
|
这里是一段代码,操作了对vector进行赋值的四种方法
#include <iostream> #include <vector> //要包含这个头文件
using namespace std; int main(void) { vector<int> a();//定义了10个整数元素的向量,但没有给出初值,因而,其值是不确定滴。
vector<int> b(,);//定义了10个证书元素的向量,且给出每个元素的初值为1
vector<int> c(b); //用另一个现成的向量来创建一个向量。
vector<int> d(b.begin(),b.begin() + );//定义了其值依次为b向量中第0到第2个元素的向量。
cout << " 1--- "; for (int i=;i<a.size();i++) cout << a[i] << " "; //使用下标形式,a[i]是向量元素操作,和数组一样
cout << '\n'; cout << " 2--- "; for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " ";//使用遍历器方式,*it是指针间接形式,它的意思是it所指向的元素值。
cout << '\n'; cout << " 3--- "; a.assign(b.begin(),b.begin()+); //b向量的0~2元素构成向量赋给a
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << " 4--- "; a.assign(,); //使a向量中只含0-7元素,且赋值给2
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << " 5--- "; int x = a.back();//将a中最后一个元素值赋给整数变量x
cout << "x = " << x << endl; cout << " 6--- "; int y = a.front(); //将a中第一个向量元素赋给整数变量y
cout << "y = " << y << endl; cout << " 7--- "; a.clear(); if (a.empty()) cout << "a is empty!" << endl; cout << " 8--- "; a.resize(); //将向量元素个数调至5个,多删少补,其值随机
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << " 9--- "; a.resize(,); //将向量元素个数调至5个,多删少补,其值均为4
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << "10--- "; a.push_back();//在向量a最后插入一个元素,其值为100
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << "11--- "; a.pop_back(); //删除a向量最后一个元素
for (vector<int>::iterator it = a.begin();it!=a.end();++it) cout << *it << " "; cout << '\n'; cout << "12--- "; if (a==b) //向量的比较操作,操作符还有!=,<,<=,>,>=,
cout << "a equal b"; else cout << "a not equal b"; cin.get(); return ; }
五、二维向量
与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:
vector< vector<int> > b(, vector<int>()); //创建一个10*5的int型二维向量
在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。
例:
#include<iostream>
#include<vector> using namespace std ;
int main() { vector< vector<int> > b(, vector<int>(, )) ;
//对部分数据进行输入
cin>>b[][] ; cin>>b[][] ; cin>>b[][];
//全部输出
int m, n ; for(m=; m<b.size(); m++) //b.size()获取行向量的大小
{ for(n=; n<b[m].size(); n++) //获取向量中具体每个向量的大小
cout<<b[m][n]<<" " ; cout<<"\n" ; }
return ; }
(转) 学习C++ -> 向量(vector)的更多相关文章
- 学习C++ -> 向量(vector)
一.向量的介绍 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器. 与string相同, vector 同属于STL(Standard Template Lib ...
- C++向量(Vector)
向量Vector: 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器. 与string相同, vector 同属于STL(Standard Template L ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++学习笔记:Vector容器
vector v:初始化一个0大小的向量 vector v(10):初始化一个10个大小的向量 push_back:增加一个元素 pop:删除一个元素,不返回 front:返回第一个元素 back:返 ...
- StarSpace是用于高效学习实体向量的通用神经模型
StarSpace是用于高效学习实体向量的通用神经模型,用于解决各种各样的问题: 学习单词,句子或文档级嵌入. 文本分类或任何其他标签任务. 信息检索:实体/文件或对象集合的排序,例如 排名网络文件. ...
- C++向量 vector动态数组
需要包含头文件, #include <vector> using namespace std; vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所 ...
- Java知多少(78)Java向量(Vector)及其应用
Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...
- c++基础之向量Vector
首先和string一样要在开头 #include <vector> #include <string> 和string一样,也算是一种容器,而且同属于STL(standard ...
- 【线性代数】1-0:向量(Vector)
title: [线性代数]1-0:向量(Vector) toc: true categories: Mathematic Linear Algebra date: 2017-08-28 10:01:2 ...
随机推荐
- Injector Job深入分析
Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...
- php中对象的串行化
我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.文章这里就PHP串行化为大家详细的介绍.你在 ...
- 文件系统:介绍一个高大上的东西 - 零基础入门学习Python030
文件系统:介绍一个高大上的东西 让编程改变世界 Change the world by program 接下来我们会介绍跟Python的文件相关的一些十分有用的模块.模块是什么?不知大家对以下代码还有 ...
- Jasper_crosstab_columngroup header position config - (headerPosition="Stretch")
Position of Totals RowThe totalPosition attribute controls the appearance of the row that displays t ...
- Jasper_plug_install
1.open eclipse -> Help -> Eclipse Marketplace. 2.at new window, find jasper, will find Jaspers ...
- My Eclipse 自动提示
1.My Eclipse 自带代码提示快捷键 “ alt+/”. 2.输入即提示:window-->preferences-->java-->Editor 展开后点击Content ...
- rlwrap 的安装使用
rlwrap 的安装使用 在Windows操作系统上,当在DOS命令窗口中运行SQL*Plus的时候,可以使用向上,向下键来跳回之前已经执行过的SQL语句.你可以根据需要修改他们,然后按Enter键重 ...
- Android 文件操作之openFileOutput
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它.创建的文件保存在/data/data/<package ...
- Win8/Win8.1都有哪些版本?我该选择哪个?(二)
Windows版本分类比较复杂,下文主要为大家理清Win8/Win8.1的版本种类.如果想了解更多,可以结合<Win7/Win8/Win8.1众多版本,我该选择哪个?>一文来了解. 细数W ...
- perl 对象 通过bless实现
对象只是一种特殊的引用,它知道自己是和哪个类关联在一起的,而构造器知道如何创建那种关联关系. 这些构造器是通过使用bless操作符,将一个普通的引用物转换成一个对象实现的,