栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

黑马:vector容器(197~203)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

黑马:vector容器(197~203)

1.基本概念

功能:

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

vector与普通数组区别:

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

动态扩展

并不是在原空间之后续借新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

vector容器的迭代器是支持随机访问的迭代器

2.vector构造函数

功能:创建vector容器

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; //默认构造 无参构造
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);

	//通过区间方式进行构造
	vectorv2(v1.begin(), v1.end());
	printVector(v2);

	//n个elem方式构造
	vectorv3(10, 100);
	printVector(v3);

	//拷贝构造
	vectorv4(v3);
	printVector(v4);
}



int main(int argc,char**argv) {
		
	
	test01();
	

	system("pause");
	return  0;
}




3.vector赋值操作

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);

	//赋值 operator=
	vectorv2;
	v2 = v1;
	printVector(v2);

	//assign
	vectorv3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

	//n个elem方式赋值
	vectorv4;
	v4.assign(10, 100);
	printVector(v4);
}



int main(int argc,char**argv) {
		
	
	test01();
	

	system("pause");
	return  0;
}




4.vector容量和大小

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);

	if (v1.empty()) {
		cout << "v1为空" << endl;
	}
	else {
		cout << "v1不为空" << endl;
		cout << "v1的容量为:" << v1.capacity() << endl;
		cout << "v1的大小为:" << v1.size() << endl;
	}

	//重新指定大小
	v1.resize(15, 100);  //如果是这样的形式 就会为那五个空间赋值为100
	printVector(v1); //默认会为多出来的那五个空间赋值为0-----v1.resize(10);
	
	v1.resize(5); //如果比原来短,那剩下的元素就删除掉了
	
}



int main(int argc,char**argv) {
		
	
	test01();
	

	system("pause");
	return  0;
}




5.vector插入和删除

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; 

	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	//遍历
	printVector(v1);

	//尾删
	v1.pop_back();
	printVector(v1);  //删掉50

	//插入 第一个参数是迭代器
	v1.insert(v1.begin(), 100);
	printVector(v1);

	v1.insert(v1.begin(),2, 100); //插入两个100在最一开始
	printVector(v1);

	//删除 参数也是迭代器
	v1.erase(v1.begin());
	printVector(v1);

	//清空
	//v1.erase(v1.begin(),v1.end());
	v1.clear(); //和上面代码等价
	printVector(v1);
	
	
}



int main(int argc,char**argv) {
		
	
	test01();
	

	system("pause");
	return  0;
}




6.vector数据存取

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}

	//利用[]方式访问数组中的元素
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;

	//利用at方式访问数组中的元素
	for (int i = 0; i < v1.size(); i++) {
		cout << v1.at(i) << " ";
	}
	cout << endl;

	//获取第一个元素
	cout << v1.front() << endl;

	//获取最后一个元素
	cout << v1.back() << endl;
}



int main(int argc,char**argv) {
		
	
	test01();
	

	system("pause");
	return  0;
}




7.vector互换容器

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void printVector(vector &v) {
	for (vector::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	vector v1; 
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	printVector(v1);

	vector v2;
	for (int i = 10; i >0; i--) {
		v2.push_back(i);
	}
	printVector(v2);

	cout << "交换后: " << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

//实际用途
void test02() {
	vector v;
	for (int i = 0; i < 100000; i++) {
		v.push_back(i);
	}

	cout << "v的容量为: " << v.capacity() << endl;
	cout << "v的大小为: " << v.size() << endl;

	v.resize(3);
	cout << "v的容量为: " << v.capacity() << endl; //容量仍为十万多 造成空间浪费
	cout << "v的大小为: " << v.size() << endl;

	//巧用swap收缩内存
	vector(v).swap(v);
	cout << "v的容量为: " << v.capacity() << endl; //容量仍为十万多 造成空间浪费
	cout << "v的大小为: " << v.size() << endl;

	//首先 vector(v) 会创造一个匿名对象x,它会根据v的大小来创造一个相等的空间(也为3)
	//然后 .swap(v)会将v和x的空间置换,这样v的空间和容量就都是3,而x呢?x是匿名对象,系统会把它十万多的空间直接回收掉

}



int main(int argc,char**argv) {
		
	
	//test01();
	test02();
	

	system("pause");
	return  0;
}




8.vector预留空间

功能:

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

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include


void test01() {
	vector v; 

	v.reserve(100000);  //直接预留出100000的空间 结果会变成1

	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 << endl;   //统计开辟了多少次内存 结果是30
	

}




int main(int argc,char**argv) {
		
	
	test01();
	
	

	system("pause");
	return  0;
}




总结:如果数据量较大,一开始就可以利用reverse预留空间

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333816.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号