概念
- vector 是一个类模版
- 是一片连续的存储空间
- 和数组一样通过下标来访问到指定的元素,下标从0开始
vector<int> ivec; // ivec保存int类型的对象
vector<vector<int>> ivec1; // 该向量的元素是vector对象
初始化
- 其中,如果没有初始化,那创建的vector对象不含有任何东西,可以理解为空数组
- 列表初始化用 { }
vector<int> ivec{"hello", "world"};
- 创建指定元素初始化
vector<int> ivec(10, 1); //10个int类型的元素,每个初始化为1
- but:
vector<int> ivec{10, 1}; //两个元素,为10和1
- 值初始化
vector<int> ivec(10); //10个int类型的元素,默认初始化为0
- but:
vector<int> ivec{10}; //一个元素,为10
关于vector < vector < int> >
- 是一个向量的向量,也就是二维向量或二维数组。每个元素都是一个整数向量,因此可以通过两个索引来访问特定的整数元素,就像访问二维数组一样。
#include <vector>
#include <iostream>
int main() {
// 创建一个包含3行2列的二维整数数组
std::vector<std::vector<int>> twoDArray(3, std::vector<int>(2));
// 向二维数组中添加一些值
twoDArray[0][0] = 1;
twoDArray[0][1] = 2;
twoDArray[1][0] = 3;
twoDArray[1][1] = 4;
twoDArray[2][0] = 5;
twoDArray[2][1] = 6;
return 0;
}
- 输出twoDArray中的所有元素
- 法一:
// 访问和输出二维数组中的值
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
std::cout << twoDArray[i][j] << " ";
}
std::cout << std::endl;
}
- 法二:
// 使用范围-based for 循环遍历二维数组并输出其内容
for (const auto& row : twoDArray) {
for (const auto& element : row) {
std::cout << element << " ";
}
std::cout << std::endl;
}
添加元素
- 要将元素0~99放到vector容器里
- 法一:用列表初始化(慢)
- 法二:利用vector成员函数push_back( ) —>尾插
int main() {
std::vector<int> ivec;
for (int i = 0; i < 100; i++) {
ivec.push_back(i);
}
// 使用范围-based for 循环遍历并打印每个元素
for (const int& element : ivec) {
// 把ivec的每个元素赋给int类型的变量element(相当于const int& element=ivec[i])
std::cout << element << " "; // 对element输出
}
}
- 错误:用下标形式对vector添加元素
ivec[i] = 1
×- 原因:vector 一开始为空,不含任何元素,只能通过push_back( )往里加元素
其它操作
int main(){
std::vector<int> v{
1, 2, 3, 4, 5};
for (auto &i : v) {
// i是一个引用
i *= i; // 可以通过改变i来改变vector里的值(如果i不是引用,则输出还是12345)
}
for (auto i : v) {
std::cout << i << " "; // 1 4 9 16 25
}
}
成员函数
vector::push_back(Type val) //将val添加到向量尾部
vector::pop_back() //将最后一个元素删除
iterator vector::begin() //返回指向第一个元素的迭代器
iterator vector::end() //返回指向最后一个元素之后的迭代器
vector::clear() //删除向量,并没有释放vector,还是占有capacity个空间,如果要释放空间,可使用 swap(vector<_Ty>()).
vector::at(n) //等效于vector[n] 返回第n个位置的引用
bool vector::empty() //向量是否为空
Type vector::front() //返回第一个元素的引用
Type vector::back() //返回最后一个元素的引用
vector::shrink_to_fit() //将capacity变为和size一样大
allocator_type vector::get_allocator() //得到分配器
题中运用
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
vector<vector<int>> v;
cin >> n;
// 创建动态二维数组,生成杨辉三角
for (int i = 0; i < n; i++) {
vector<int> row(i + 1, 1); // 每行元素个数不同,因此创建的row大小也不同
for (int j = 1; j < i; j++) {
row[j] =
v[i - 1][j - 1] + v[i - 1][j]; // 从第三行开始需要按规律计算
}
v.push_back(row); // 把生成好的这一整行向量row加入到二维向量v里
}
// 打印输出
for (auto row_ : v) {
for (auto element : row_) {
cout << element << " ";
}
cout << endl;
}
}