C++学习笔记7——vector

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++下根本无法编译通过。
所以结论是:不要使用这种表达方式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值