vector 容器 c++

本文详细探讨了C++ STL中vector容器的多种使用方式,包括存储内置数据类型和自定义类型、嵌套容器、构造函数、赋值操作、容量与大小管理、插入与删除、数据存取及容器互换等高级技巧,为读者提供了全面的vector容器使用指南。

vector中存放内置数据类型在这里插入图片描述

#include<vector>
#include<algorithm>

class Person
{
public:
	int m_age;
	string m_name;
	Person(int age, string name)
	{
		m_age = age;
		m_name = name;
	}
};
void test01()
{
	Person p1(12, "a");
	Person p2(10, "t");
	Person p3(13, "b");
	Person p4(14, "c");
	Person p5(15, "v");
	Person p6(16, "f");
	Person p7(17, "h");
	vector<Person> v;
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);
	v.push_back(p6);
	v.push_back(p7);
	for (vector<Person> ::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "名字" << it->m_name << "  年龄" << it->m_age << "  ";
	}
	cout << endl;
}
// vector 存放的是自定义类型的指针
void test02()
{
	Person p1(12, "a");
	Person p2(10, "t");
	Person p3(13, "b");
	Person p4(14, "c");
	Person p5(15, "v");
	Person p6(16, "f");
	Person p7(17, "h");
	vector<Person*> v;
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	v.push_back(&p5);
	v.push_back(&p6);
	v.push_back(&p7);
	for (vector<Person*> ::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "名字" << (*it)->m_name<< "  年龄" << (*it)->m_age << "  ";
	}
	cout << endl;
}
int main()
{
	test01();
	test02();
	return 0;
}

vector容器中再嵌套容器

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>


void test01()
{
	vector<vector<int>>v;
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;
	for (int i = 0; i < 5; i++)
	{
		v1.push_back(i + 1);
		v2.push_back(i + 2);
		v3.push_back(i + 3);
		v4.push_back(i + 4);
	}
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);
	for (vector<vector<int>> ::iterator it = v.begin(); it != v.end(); it++)
	{
		// (*it) 就是一个容器 vector<int>
		for (vector<int> ::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
		{
			cout << *vit << "  ";
		}
		cout << endl;
	}

}

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

vector构造函数

在这里插入图片描述
在这里插入图片描述

#include<vector>
#include<algorithm>

void prinftVector(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 < 5; i++)
	{
		v1.push_back(i + 1);
	}
	prinftVector(v1);
	// 通过区间的方式进行构造
	vector<int> v2(v1.begin(), v1.end());
	prinftVector(v2);
	// n个elem方式进行构造
	vector<int> v3(10, 100);
	prinftVector(v3);

	// 拷贝构造
	vector<int> v4(v3);
	prinftVector(v4);

}

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

vector容器的赋值操作

在这里插入图片描述

#include<vector>
#include<algorithm>

void prinftVector(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 < 5; i++)
	{
		v1.push_back(i + 1);
	}
	prinftVector(v1);

	// 赋值  operator=
	vector<int> v2;
	v2 = v1;
	prinftVector(v2);

	// assign

	vector<int> v3;
	v3.assign(v1.begin(), v1.end());
	prinftVector(v3);

	// n个elem赋值
	vector<int> v4;
	v4.assign(10, 100);
	prinftVector(v4);
	

}

vector容量和大小

卷面, 好几年  吉姆

void prinftVector(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 < 5; i++)
	{
		v1.push_back(i + 1);
	}
	prinftVector(v1);
	if (v1.empty()) // 为真 代表容器为空
	{
		cout << "v1为空" << endl;
	}
	else
	{
		cout << "v1不为空" << endl;
		cout << "v1的容量为: " << v1.capacity() << endl;
		cout << "v1的大小为:" << v1.size() << endl;
	}
	// resize 重新指定大小
	v1.resize(13, 100); // 利用重载的版本 可以指定默认填充值
	prinftVector(v1); // 如果重新指定的比原来长 默认用0填充新位置
	v1.resize(3); // 如果指定的比原来短了 超出的部分会被直接删除
	

}

vector插入和删除

在这里插入图片描述

void prinftVector(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 < 5; i++)
	{
		v1.push_back(i + 1); // 尾插
	}
	prinftVector(v1);
	
	// 尾删
	v1.pop_back();
	prinftVector(v1);

	// 插入
	v1.insert(v1.begin(), 100);
	prinftVector(v1);

	v1.insert(v1.begin(), 3, 1000);
	prinftVector(v1);

	// 删除
	v1.erase(v1.begin());
	prinftVector(v1);

	// 清空
	v1.clear();
	prinftVector(v1);

}

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

vector数据的存取

在这里插入图片描述

void prinftVector(vector<int> &v)
{
	for (int i = 0; i < v.size(); i++) // 利用中括号的方式来访问vector容器中的元素
	{
		cout << v[i] << "  ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1; 
	for (int i = 0; i < 5; i++)
	{
		v1.push_back(i + 1);
	}
	prinftVector(v1);

	//利用at的方式来访问元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1.at(i) << "  ";
	}
	cout << endl;
	cout << "获得第一个元素" << v1.front() << endl;
	cout << "获得最后一个元素" << v1.back() << endl;

}

vector互换容器

在这里插入图片描述

void prinftVector(vector<int> &v)
{
	for (int i = 0; i < v.size(); i++) // 利用中括号的方式来访问vector容器中的元素
	{
		cout << v[i] << "  ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1; 
	for (int i = 0; i < 5; i++)
	{
		v1.push_back(i + 1);
	}
	prinftVector(v1);
	
	vector<int> v2;
	for (int i = 5; i > 0; i--)
	{
		v2.push_back(i);
	}
	prinftVector(v2);
	// 交换容器
	v1.swap(v2);
	prinftVector(v1);
	prinftVector(v2);


}
void test02()
{
	// 实际用途 巧用swap可以收缩内存空间
	vector<int> v3;
	for (int i = 0; i < 1000000; i++)
	{
		v3.push_back(i + 1);
	}
	cout << "v3的容量为: " << v3.capacity() << endl;
	cout << "v3的大小为:" << v3.size() << endl;

	v3.resize(10); // 重新指定大小
	cout << "v3的容量为: " << v3.capacity() << endl;
	cout << "v3的大小为:" << v3.size() << endl;
	// 巧用swap可以收缩内存空间

	vector<int>(v3).swap(v3);  
	/* vector<int>(v3) 这里是一个匿名对象 
	它的大小和容量均为v3的大小 也就是10 10 
	然后通过swap进行交换后  v3的大小和容量变为了10 10 
	而匿名对象的大小和容量变为了 v3的大小和容量 也就是10 1049869
	但是匿名对象的特点就是一旦执行完这行代码 当编译器识别到这是一个匿名对象后 就会释放匿名对象的内存 

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


}

vector预留空间

在这里插入图片描述

void test01()
{
	vector<int> v1; 
	v1.reserve(1000); 
	int  num = 0; // 统计开辟次数 
	int* p = NULL;
	for (int i = 0; i < 100; i++)
	{
		v1.push_back(i + 1);
		if (p != &v1[0])
		{
			p = &v1[0];
			num++;
		}

	}
	cout << num << endl;
	// 如果数据量比较大 一开始可以利用reserve预留空间
	
	
	
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值