标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector“容纳”其他对象,所以它也常被称为容器。
要想用vector,必须包含头文件和声明:
#include <vector>
using std::vector;
//或者
using namespace std;
注意:vector是模板,而非类型,使用时必须指定vector生成的类型,例如vector<int>(和模板的定义很相似)
关于定义和初始化:
如何确定是列表初始值还是元素数量:依赖于用的是花括号还是圆括号。
vector<int> v1(10); //10个元素,每个都是0
vector<int> v2{10}; //1个元素,值是0
vector<int> v3(10,1); //10个元素,每个都是1
vector<int> v4{10,1}; //2个元素,分别是10,1
常用的vector操作:
v.empty() //如果v不含有任何元素,返回真
v.size() //返回v中元素个数
v.push_back() //向v的尾端添加值
v[n] //返回v中第n个位置的元素,注意下标从0开始,不要越界!!!
v1 == v2 v1 != v2......
vector的empty和size两个成员与string的同名成员功能完全一致:empty检查vector对象是否包含元素然后返回一个布尔值;size返回vector对象中元素个数,返回值的类型是由vector定义的size_type类型。
注意:要使用size_type,需首先指定它是哪种类型定义的。例如vector<int>::size_type 而不是vector::size_type
因为最近接触的项目里很多地方用到vector,所以对size_type需要多加理解。
给出项目里一部分代码:
for (vector<sPedestrian>::size_type iy = 1; iy != tracklet_set[ix].Tracklet.size(); ++iy)
{
tracklet_set[ix].Tracklet[iy].vector_x = tracklet_set[ix].Tracklet[iy].x - tracklet_set[ix].Tracklet[iy-1].x;
tracklet_set[ix].Tracklet[iy].vector_y = tracklet_set[ix].Tracklet[iy].y - tracklet_set[ix].Tracklet[iy-1].y;
//cout<<endl<<tracklet_set[ix].Tracklet[iy].vector_x<<" "<<tracklet_set[ix].Tracklet[iy].vector_y<<endl;
}
当时看到这里我有点懵,平时在for循环里直接定义int iy=1就好了,想想这样写也不会报错。
for ( std::vector<int>::size_type i = 0; i < a.size(); i++ )
for ( int i = 0; i < a.size(); i++ )
后来查了下相关资料,给出下面的解释:
size_type 相当于 unsigned int类型,使用size_type 主要是为了适应不同的平台,int 类型大小会根据不同平台而不同,所以应该是size_type 好。
其实要说肯定是size_type好,但是后面的写法简单明了,只是想把i当做一个计数器,感觉也没有必要用那么复杂的写法。
当然编译器可能给出一个这样的警告:warning C4018: “<”: 有符号/无符号不匹配