Lesson 06 vector类(上)

2023-12-31 23:32:04

C++:渴望力量吗,少年?


一、vector是什么?

??vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
注意:使用vector需要包含头文件 < vector >

二、vector的使用

1. 构造函数

函数名称功能说明
vector()(重点)无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector (const vector& x); (重点)拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

2. vector iterator

iterator的使用接口说明
begin + end(重点)获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator /const_iterator
rbegin + rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

在这里插入图片描述

3. vector 空间增长问题

容量空间接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize(重点)改变vector的size
reserve (重点)改变vector的capacity

4. vector增删查改

函数名称功能说明
push_back(重点)尾插
pop_back (重点)尾删
?nd查找并返回位置
insert在position之前插入val
erase删除position位置的数据
swap交换两个vector的数据空间
operator[ ] (重点)可以像数组一样访问

三、vector实际使用

代码如下:

#include<iostream>
#include<vector>

using namespace std;

void test_vector1()
{
	cout << "我是 test_vector1()" << endl;
	vector<int> v1;
	vector<int> v2(10, 0);//内容是10个0

	vector<int> v3(v2.begin(), v2.end());//可以用迭代器初始化
	string str("hello world");
	vector<int> v4(str.begin(), str.end());//也可以用其他容器的迭代器初始化
	vector<int> v5(v4);//拷贝构造

    //遍历
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << " ";//运算符重载
	}
	cout << endl;

	//vector<int>::iterator it = v4.begin();
	auto it = v4.begin();//迭代器遍历
	while (it != v4.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : v5)//范围for遍历(本质上还是迭代器)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << endl;
}

void test_vector2()
{
	cout << "我是 test_vector2()" << endl;

	size_t sz;
	vector<int> v;
	//v.reserve(55);//1可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)//查看扩容的具体数据
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
    //vs下使用的STL基本是按照1.5倍方式扩容
	cout << endl;
}

void test_vector3()
{
	cout << "我是 test_vector3()" << endl;

	vector<int> v1;
	cout << v1.max_size() << endl;//没啥用

	vector<int> v;
	//v.reserve(100);  // size = 0    capacity 100
	v.resize(100);     // size = 100  capacity 100

	for (size_t i = 0; i < 100; i++)
	{
		v[i] = i;//如果是注释上面的v.resize(100),取消对v.reserve(100)的注释仍会报错
		//虽然空间是开出来了,但是因为这个运算符重载包含对下标的断言,超过size就报错
	}

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

	cout << endl;
}

void test_vector4()
{
	cout << "我是 test_vector4()" << endl;

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

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

	v.insert(v.begin(), 0);//和string一样,效率不高,不建议经常使用

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

	auto it = find(v.begin(), v.end(), 3);//在首尾之间找数字3并返回下标
	if (it != v.end())
	{
		v.insert(it, 30);//在3前面插入30
	}

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

	it = find(v.begin(), v.end(), 3);
	if (it != v.end())
	{
		v.erase(it);//删除元素
	}

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

	cout << "Before clear:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.clear();//清除内容,容量还在
	cout << "After clear:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.shrink_to_fit();//缩容至合适的容量,不怎么使用
	cout << "After shrink_to_fit:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	cout << endl;
}

int main()
{
	test_vector1();
	test_vector2();
	test_vector3();
	test_vector4();

	return 0;
}

vector的使用和string差不多,其余操作可以自行查阅或者参考之前的文章:
String类(上)
String类(中)


文章来源:https://blog.csdn.net/callmeggyh/article/details/134783174
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。