【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;
}
};