C++STL容器之vector

目录

一、基本概念

1、功能

2、vector容器与普通数组的区别

3、动态扩展 

二、构造函数

1、函数 

2、代码 

三、赋值操作

1、函数

2、测试 

四、容量和大小

1、函数

2、测试

五、插入和删除

1、函数

2、测试 

六、数据存取

1、函数

2、测试 

七、互换容器

1、函数

2、测试 

八、预留空间

1、函数 

2、测试 


一、基本概念

1、功能

vector数据结构和数组非常相似,也成为单端数组 

2、vector容器与普通数组的区别

数组是静态空间,而vector可以动态扩展 

3、动态扩展 

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
  • vector容器的迭代器是支持随机访问的迭代器

二、构造函数

1、函数 

vector<T> v;                                          //采用模板实现类实现,默认构造函数

vector(v.begin(),v.end());                     //将v[begin(),end()]区间中的元素拷贝给本身

vector(n,elem);                                     //构造函数将n个elem拷贝给本身

vector(const vector &vec);                 //拷贝构造函数

2、代码 

#include<vector>
//vector容器构造函数
void printVector(vector<int> &v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it<<" ";
	}
	cout << endl;
}
void Test01() {
	//默认无参构造
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);//0 1 2 3 4 5 6 7 8 9

	//通过区间的方式进行构造
	vector<int>v2(v1.begin(), v1.end()) ;
	printVector(v2);//0 1 2 3 4 5 6 7 8 9

	//n个elem方式构造
	vector<int>v3(10, 100);//十个100
	printVector(v3);//100 100 100 100 100 100 100 100 100 100

	//拷贝构造
	vector<int>v4(v3);
	printVector(v4);//100 100 100 100 100 100 100 100 100 100
}
int main() {
	Test01();
	return 0;
}

三、赋值操作

1、函数

vector& operator=(const vector &vec);                 //重载等号运算符

assign(beg,end);                                                  //将[beg,end]区间中的数据拷贝赋值给本身

assign(n elem);                                                    // 将n个elem拷贝赋值给本身

2、测试 

#include<vector>
void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
//vector赋值操作
void Test02() {
	vector<int> v1;
	for (int i = 0; i < 10;i++) {
		v1.push_back(i);
	}
	printVector(v1);//0 1 2 3 4 5 6 7 8 9

	//赋值    重载=
	vector<int> v2;
	v2 = v1;
	printVector(v2);//0 1 2 3 4 5 6 7 8 9

	//assign
	vector<int> v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);//0 1 2 3 4 5 6 7 8 9

	//assign n个elem
	vector<int> v4;
	v4.assign(10, 100);
	printVector(v4);//100 100 100 100 100 100 100 100 100 100
}
int main() {
	Test02();
	return 0;
}

四、容量和大小

1、函数

empty();                                                          //判断容器是否为空

capacity();                                                      //容器的容量

size();                                                             //返回容器中元素的个数

resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置;若容器变短,则末尾超出容器长度的元素被删除

resize(int num,elem);// 重新指定容器的长度为num,若容器变长,则以elem填充新位置;若容器变短,则末尾超出容器长度的元素被删除

2、测试

#include<vector>
void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void Test03() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);//0 1 2 3 4 5 6 7 8 9
	if(v1.empty()) {
		cout << "v1为空"<< endl;
	}
	else {
		cout << "v1不为空" << endl;
		cout << "v1容量为:" << v1.capacity() << endl;//13
		cout << "v1大小为:" << v1.size() << endl;//10
		//容量永远大于大小
	}

	//resize重新指定大小,利用重载版本,可以指定默认填充值
	v1.resize(15);
	printVector(v1);//若重新指定的长度比原来长,默认用0来填充新的位置
	//0 1 2 3 4 5 6 7 8 9 0 0 0 0 0

	v1.resize(20, 100);//0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 100 100 100 100 100
	printVector(v1);
	/*cout << v1.capacity() << endl;//28
	cout << v1.size() << endl;//20*/

	v1.resize(5);//若重新指定的长度比原来短,超出部分元素被删除
	printVector(v1);//0 1 2 3 4
}
int main() {
	Test03();
	return 0;
}

五、插入和删除

1、函数

push_back(elem);                                                //尾部插入元素elem

pop_back();                                                          //删除最后一个元素

insert(const_iterator pos,elem);                        //迭代器指向位置pos插入元素elem

insert(const_iterator pos,int count,elem);        //迭代器指向位置pos插入count个元素elem

erase(const_iterator pos);                                    //删除迭代器指向元素

erase(const_iterator start,const_iterator end);  //删除迭代器从start到end之间的元素

clear();                                                                    //删除容器中所有元素

2、测试 

#include<vector>
void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
//插入和删除
void Test04() {
	vector<int> v1;
	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	printVector(v1);//10 20 30 40 50
	//尾部删除
	v1.pop_back();
	printVector(v1);//10 20 30 40
	//插入 第一个参数是迭代器
	v1.insert(v1.begin(), 100);
	printVector(v1);//100 10 20 30 40

	v1.insert(v1.begin(), 2, 200);
	printVector(v1);//200 200 100 10 20 30 40

	//删除
	v1.erase(v1.begin());
	printVector(v1);// 200 100 10 20 30 40

	//清空
	//v1.erase(v1.begin(),v1.end());
	v1.clear();
	printVector(v1);
}
int main() {
	Test04();
	return 0;
}

六、数据存取

1、函数

除了用迭代器获取vector容器中元素,还可以通过[]或at方式

at(int idx);                                            //返回索引idx所指的数据

opeartor[];                                           //返回索引idx所指的数据

front();                                                //返回容器中第一个数据元素

back();                                               //返回容器中最后一个数据元素

2、测试 

#include<vector>
//数据存取
void Test05() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	//利用[]方式访问元素
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}//0 1 2 3 4 5 6 7 8 9
	cout << endl;
	//利用at方式访问元素
	for (int i = 0; i < v1.size(); i++) {
		cout << v1.at(i) << " ";
	}//0 1 2 3 4 5 6 7 8 9
	cout << endl;
	//获取第一个元素
	cout << "第一个元素为:" << v1.front() << endl;//第一个元素为:0
	//获取最后一个元素
	cout << "最后一个元素为:" << v1.back() << endl;//最后一个元素为 : 9

}
int main() {
	Test05();
	return 0;
}

七、互换容器

实现两个容器内元素进行互换

1、函数

 swap(vec);                                              //将vec与本身元素进行互换

2、测试 

#include<vector>
void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
//互换容器
//1、基本使用
void Test06() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);//0 1 2 3 4 5 6 7 8 9
	
	vector<int> v2;
	for (int i = 10; i > 0; i--) {
		v2.push_back(i);
	}
	printVector(v2);//10 9 8 7 6 5 4 3 2 1

	cout << "交换后:" << endl;
	swap(v1, v2);
	printVector(v1);//10 9 8 7 6 5 4 3 2 1
	printVector(v2);//0 1 2 3 4 5 6 7 8 9
}
//2、实际用途
//巧用swap可以收缩内存空间
void Test07() {
	vector<int> v;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
	}
	cout << "v容量为:" << v.capacity() << endl;//v容量为:138255
	cout << "v大小为:" << v.size() << endl;//v大小为:100000

	v.resize(4);//大小缩小了,但是容量没有变
	cout << "v容量为:" << v.capacity() << endl;//v容量为 : 138255
	cout << "v大小为:" << v.size() << endl;//v大小为 : 4

	//巧用swap可以收缩内存空间
	vector<int>(v).swap(v);
	
	cout << "v容量为:" << v.capacity() << endl;//v容量为 : 4
	cout << "v大小为:" << v.size() << endl;//v大小为 : 4
}
int main() {
	Test06();
	Test07();
	return 0;
}

巧用swap可以收缩内存空间
vector<int>(v).swap(v);

  • vector<int>(v)--利用拷贝构造函数创建了一个匿名对象,会用v当前所用的元素个数来初始化匿名对象;匿名对象在执行完这行代码之后,系统会将其回收掉
  • swap(v)--容器交换 

八、预留空间

减少vector在动态扩展容量时的扩展次数 

1、函数 

reserve(int len);                        //容器预留len个元素长度,预留位置不初始化,元素不可访问

2、测试 

#include<vector>
//预留空间
void Test08() {
	vector<int> v;

	//利用reserve预留空间
	v.reserve(100000);

	int num = 0;//统计开辟次数
	int* p = NULL;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
		if (p != &v[0]) {
			p = &v[0];
			num++;
		}
	}
	cout << "num=" << num << endl;

}
int main() {
	Test08();
	return 0;
}

在此代码中,如果不预留空间,num=30,也就是说需要开辟30次空间;如果提前用reserve函数预留空间的话,num=1

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值