栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++:vector

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

C++:vector

目录

一.vector的定义

1.vector构造函数

2.vector遍历

3.vector的增容

(1)两种版本下的扩容

(2)单次增容增多少的问题分析:(不用考虑内存对齐)

(3)vector开空间用reserve还是resize?——用reserve

(4)string vector等都有一个特点,删除数据,一般是不会主动缩容

4.vector的几个常用函数

(1)insert,erase

(2)swap

(3)clear 

 (4)vector中没有find函数,要用算法中的find函数

(5)算法中的排序 sort 


一.vector的定义

定义:可以动态增长的数组

1.vector构造函数

size_type 就是被typedef的size_t

 

#include
#include
using namespace std;

void test_vector1()
{
	vector v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

	vector v2;
	v2.push_back(1.1);
	v2.push_back(2.2);
	v2.push_back(3.3);

	vector v3;
	v3.push_back("李白");    //单参数的构造函数支持隐式类型转换:
	v3.push_back("杜甫");    //string s="hello world";先构造再拷贝构造
	v3.push_back("苏轼");
	v3.push_back("白居易");

	vector v4(10, 5);

	vector v5(++v3.begin(), --v3.end()); //迭代器,此处是"杜甫","苏轼"
	string s = "hello world";

	vector v6(s.begin(), s.end());
}

2.vector遍历

与string遍历大致相同

void test_vector2()
{
	// 遍历
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	// 1、下表+[]
	for (size_t i = 0; i < v.size(); ++i)
	{
		v[i] += 1;
		cout << v[i] << " ";
	}
	cout << endl;

	// 2.迭代器
	vector::iterator it = v.begin();
	while (it != v.end())
	{
		*it -= 1;
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 3.范围for
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

3.vector的增容

(1)两种版本下的扩容

vs下面-- PJ版本——1. 5倍增容
linux g++ SGI版本——2倍增容
 

(2)单次增容增多少的问题分析:(不用考虑内存对齐)

即为什么vs下扩容按1.5倍扩容,linux的g++扩容按2倍扩容?

单次增容越多,插入N个值,增容次数越少,效率就越高,但是浪费空间就越多;
单次增容越少,浪费空间就少了,但是会导致频繁增容,效率低下。

因此不一定是1.5倍或者2倍,也可能是3,4倍,只是1.5或2倍是一个比较平衡的值。

(3)vector开空间用reserve还是resize?——用reserve

如果知道要开多大空间,就用reserve提前开好。

如果用resize就是开空间并初始化,比如foo.resize(100); 开100个int空间,全部初始化成0,如果再foo.push_back(i); 就是在这100个空间以后再加数据,因为前100个已经有数据了

void test_vector3()
{
	//vector v;
	//cout << v.max_size() << endl;
	size_t sz;
	std::vector foo;
	foo.reserve(100);        //如果知道要开多大空间,就用reserve提前开好
	//foo.resize(100);
	sz = foo.capacity();
	std::cout << "making foo grow:n";
	for (int i = 0; i < 100; ++i) {
		foo.push_back(i);
		if (sz != foo.capacity()) {
			sz = foo.capacity();
			std::cout << "capacity changed: " << sz << 'n';
		}
	}

}

(4)string vector等都有一个特点,删除数据,一般是不会主动缩容

若非要缩容,那就用函数 shrink_to_fit() ,但是要慎用,少用,表面是缩容_capacity——>_size,实际它的底层是开辟一块_size的空间,并把内容拷贝过来,实际上是用时间换空间了,但是我们一般是不差空间的,而且通常是用空间换时间,所以说不建议时间换空间的做法,即:少用 shrink_to_fit() 函数。

void test_vector3()
{
	//vector v;
	//cout << v.max_size() << endl;
	size_t sz;
	std::vector foo;
	foo.reserve(100);
	//foo.resize(100);
	sz = foo.capacity();
	std::cout << "making foo grow:n";
	for (int i = 0; i < 100; ++i) {
		foo.push_back(i);
		if (sz != foo.capacity()) {
			sz = foo.capacity();
			std::cout << "capacity changed: " << sz << 'n';
		}
	}

	//vector countV;
	//countV.resize(100, 1);
	//countV.resize(10);

	// string vector等都有一个特点,删除数据,一般是不会主动缩容
	foo.resize(10);
	cout << foo.size() << endl;
	cout << foo.capacity() << endl;

	// 慎用、少用
	foo.shrink_to_fit();
	cout << foo.size() << endl;
	cout << foo.capacity() << endl;
}

4.vector的几个常用函数

(1)insert,erase

 他们都是不支持下标增加或删除的,都是用的迭代器

返回值是iterator是为了解决迭代器失效,这个后面再详细说。

 

void test_vector4()
{
	// 遍历
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	v.insert(v.begin(), -1);
	v.insert(v.begin(), -2);
	v.insert(v.begin(), -3);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.insert(v.begin()+7, 300);
	//v.insert(v.begin()+8, 300);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.erase(v.begin());
	v.erase(v.begin());

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

(2)swap

交换两个vector类对象指向的空间,例如:v1.swap(v2);

(3)clear 

清掉全部数据

 

 (4)vector中没有find函数,要用算法中的find函数

 algorithm——算法                #include

void test_vector5()
{
	// 遍历
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	//vector::iterator pos = find(v.begin(), v.end(), 3);
	auto pos = find(v.begin(), v.end(), 3);   //类型太长可以用auto
	if (pos != v.end())
	{
		cout << "找到了" << endl;
		v.erase(pos);
	}
	else
	{
		cout << "没有找到" << endl;
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

(5)算法中的排序 sort 

#include
 

 sort默认是升序

void test_vector5()
{
	// 遍历
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(4);

	v.push_back(0);
	v.push_back(9);
	v.push_back(3);
	v.push_back(1);

	// 默认是升序
	sort(v.begin(), v.end());   // <

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

  排降序,仿函数
关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲

void test_vector5()
{
	// 遍历
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(4);

	v.push_back(0);
	v.push_back(9);
	v.push_back(3);
	v.push_back(1);

	// 默认是升序
	//sort(v.begin(), v.end());   // <

	// 排降序,仿函数
	// 关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲
	// sort(v.begin(), v.end(), greater());  // >

	greater g;
	sort(v.begin(), v.end(), g);  // >


	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

5.题目:杨辉三角

118. 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

 解法:

 

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

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

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