vector
关于使用
对于空调用:q[v].size();
其支持q[v].back(), q[v].pop_back();
常见对比:vector只能访问已有空间,若不预开空间则会非法访问
vector<int> q[N];
等价于
vector<vector<int>> q(n, vector<int>(0));
对于t组测试数据:实际上vector<vector
减少扩容复制操作的时间
for(cin >> T >> id; T; -- T) {
int n, m, c, f;
cin >> n >> m >> c >> f;
vector<vector<int>> a(n, vector<int>(m));//且局部变量vector初始都为0无须清空
for(auto &i : a) {
for(auto &j : i) {
cout << j << endl;
}
}
}
vector构造函数
(1)参数,(2)参数(n,2)为n大小,都为2的数组
//两种方法都可以
vector<int> a(n);//构造n大小的vector
a.resize(n);
//对于遍历也可以使用cin>>a[i]直接赋值,也可以范围遍历(&x进行赋值),但范围遍历下标只能从0开始
**
构造函数构造n*m的二维vector嵌套**
即可将vector(开在局部变量)避免多组测试数据未情况问题,下标为0~n-1和0~m-1
//类型为vector套vector,外层n个vector,内层是长度为m的vector
vector<vector<int>> a(n, vector<int>(m));
对于线性空间来说,地址为连续(后=前+1),起始地址为begin,终止位置+1为end
其中不应该访问end下标(end有可能是实际vector最后一个位置的下一个位置,即未被扩展位置),所以最多访问end-1
范围遍历(上下等价)
对于范围遍历来说,不加&意味着值拷贝,而加上&后意味着对原值取引用(修改引用值反映到原值时尚)
for(auto x : a) {
cout << x << ' ';
}
//用指针从begin开始扫,一直扫到end前面元素
for(auto it = a.begin(); it != a.end(); ++ it) {
auto i = *it;//用i取指针传的值
cout << i << ' ';
}
我们知道&引用修改值后:即可范围存值
vector<int> a(n);
for(auto &x : a) {
cin >> x;
}
等价
for (int i = 0; i < n; ++i)
cin >> nums[i];
其中的x只是取a的值,对x进行修改不会影响到a
&x:(引用)后,x的地址和a的地址相同,则可以对a进行修改,类似函数传参,只有加&符号才可以将传入函数值改变
浙公网安备 33010602011771号