您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记7——vector

2015-10-10 19:58 706 查看
1,头文件与命名空间

#include <vector>
using std::vector;


2,属性

vector不是一个数据类型,也不是类,而是一个类模板(class template)

vector的每一个具体实现才是类。

个人理解,C++用vector来取代C语言中的数组。

vector<int> ivec ;
vector<string> svec;
vector<xy_vect> xyvec;
//vector<int> vector<string>和vector<xy_vect>才是数据类型





3,vector对象的定义和初始化

四种方式:

T为数据类型内置类型或类类型都可以

unsigned int n = 5;
vector<T> v1;        //v1为空,长度为0
vector<T> v2(v1);    //v2为v1的一个副本,用v1来初始化v2
vector<T> v3(n,i);   // i为T类型的变量(或字面值),或可以自动转化为T类型。n可以是变量或字面值。
vector<T> v4(n);     //如果T为内置类型,则v4含有n个0,若T为类类型,则用默认构造函数来初始化。
对于第四种方式需要注意,如果T是类类型,其定义了构造函数但是没有定义默认构造函数,则不能使用这种vector定义方式。

第5种方式,用数组或数组的一部分初始化:

int a[5] = {1,2,3,4,5};
vector ivec(a+i,a+j);


则ivec里包含a[i]到a[j-1]的内容

注意:j一定要大于i

如果j == i,不报错,但是ivec里面没有内容;

如果j < i,一定会报错

4,vector对象的操作

(1)size:返回相应vector类定义的size_type。

注意,这个size_type是特定类类型的size_type,所以必须用域操作符指明。

vector<int>::size_type  //ok!
vector::size_type       //error!


(2)push_back

在vector的最后插入新的元素。

这个操作会改变vector的长度,即改变size的输出

ivect.push_back(3);


(3)empty

判断vector是否为空

(4)下标操作

类似于数组,用于读写,获取已经存在的元素。

但是千万注意,下标操作不能用来增加vector的长度,即不能用来添加元素,否则会造成“缓冲区溢出”(buffer overflow).

要想添加元素,请用push_back成员函数。

(5)erase 删除vector中的元素

这个操作并不是仅仅将已有的元素置为0,而是真正的删除它,会缩短vector的长度。

vector::erase()方法有两种重载形式

如下:

iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是删除指定位置的元素时:

返回值是一个迭代器,指向删除元素下一个元素;

如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

示例:

ivec.push_back(0);
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
cout << "before: ivec.size " << ivec.size() << endl;

for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
{
cout << *iter << endl;
}

vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
cout << "*iter2 = " << *iter2 << endl;

//删除
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
{
if (*iter == 2)
{
iter = ivec.erase(iter);//删除后返回下一个位置
}
else
{
iter++;
}
}

cout << "after: ivec.size " << ivec.size() << endl;


5,备注

const vector<int> ivect(6);
定义了一个const vector。这代表了两个含义:

1,该vector的元素是const的,所以里面的值不能修改。

ivect[0] = 3; //error C3892: “iVec2”: 不能给常量赋值
2,该vector本身是const的,所以其大小不能改变,任何改变其大小的操作都不能实现。

iVec2.push_back(7);//不能将“this”指针从“const std::vector<_Ty>”转换为“std::vector<_Ty> &”


对于
vector<const int> ivect(6);
在visual studio下可以编译通过,但是并不限制对其元素的修改,所以和普通的vector并无区别;

在g++下根本无法编译通过。

所以结论是:不要使用这种表达方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: