【C++】vector的使用

1.什么是vector

vector就是一个动态顺序表,比起string,它不仅可以存储字符,还可以存储其他的内置类型以及自定义类型。
vector在使用时,通过类模板的实例化来改变其存储的元素类型:

void test4()
{
	vector<int> v1;
	vector<char> v2;
	vector<std::string> v3;
	std::string s("abc");
	v1.push_back(1);
	v2.push_back('a');
	v3.push_back(s);
}

2.容量操作

2.1 reserve和resize
这两个函数在vector中与string中的作用是相同的
下面仅作演示:

void test5()
{
	vector<int> v1;
	cout << v1.capacity() << endl;
	v1.reserve(10);
	cout << v1.capacity() << endl;
	v1.resize(15, 3);
	cout << v1.capacity() << endl;
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

size():获取数据个数
capacity():获取容量大小
empty():判断是否为空

3.增删查改

在vector中插入只有push_back和insert,没有append和+=。其中insert的用法与string中有些不同,参数pos的类型是迭代器类型,不能传下标。

void test6()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.insert(v.begin()+1, 30);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

insert更多是搭配find一起使用,这个find是算法库中的,需要包头文件algorithm
在这里插入图片描述

void test7()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator pos = std::find(v.begin(), v.end(), 3);
	v.insert(pos, 30);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述
erase中的pos参数类型也是迭代器类型;

void test7()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator pos = std::find(v.begin(), v.end(), 3);
	v.erase(pos);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.erase(v.begin() + 1, v.end());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述
assign会将vector中的数据全部删除,然后用新的内容覆盖。
在这里插入图片描述

void test8()
{
	string str("abcdefg");
	vector<char> v;
	v.assign(str.begin() + 1, str.end() - 2);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.assign(5, 'a');
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.assign(str.begin() + 1, str.end() - 2);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述
operator[]和at:
operator[]越界访问直接报错
at越界访问报异常

4.杨辉三角(使用vector开辟二维数组)

https://leetcode.cn/problems/pascals-triangle/
在这里插入图片描述
用vector开辟二维数组相比malloc要简单许多,首先要创建一个元素类型为vector类型的vector,然后用resize初始化即可。

class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> vv;
        vv.resize(numRows, vector<int>());		// 使用匿名对象初始化,会自动调用vector的构造函数
        for (int i = 0; i < vv.size(); ++i)
        {
            vv[i].resize(i+1, 0);				// 给每一个vector<int>初始化
            vv[i][0] = vv[i][vv[i].size()-1] = 1;// 将每一行的最左端和最右端的数设定为1
            for (int j = 1; j < vv[i].size(); ++j)
            {
                if (vv[i][j] == 0)
                {
                    vv[i][j] = vv[i-1][j] + vv[i-1][j-1];
                }
            }
        }
        return vv;
    }
};