vector<int> v,vector<int> v(n),vector<int> v[n]的区别

对于vector<int>arr,是指没有确定容量,这时候需要使用push_back函数进行输入

运行:

	vector<int> v;
	cout << v.size();

输出为:
0

输入方式:

	vector<int>num;
	for (int i = 0; i < n; i++) {
		int nnum;
		cin >> nnum;
		num.push_back(nnum);
	}

对于vector<int>arr(n),相当于vector<int>arr(n,0),也就是vector<int>arr(n,val),对一个确定容量n的动态数组arr的所有元素赋值0,也就是val。

如果这种情况再使用push_back,则数组不会发生变化,即插入不进去。
如果要使得位置0存储元素x,则只能使用v[0]=x,如果使用v.insert(x)插入变量x,那么v的第一个元素还是0,即v[0]=0,因为v.push_back(x)是将x插入到v[n],又因为声明v时,v最多能存储n个元素,即x根本没有成功插入容器v中。

运行:
	vector<int> v(5);
	cout << v.size() << endl;
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	vector<int> w(5, -1);
	for (int i = 0; i < w.size(); i++) {
		cout << w[i] << " ";
	}
	
输出为:
5
0 0 0 0 0
-1 -1 -1 -1 -1

对于vector<int>arr[n],可以理解为是二维数组,定义了一个长度为n的数组,数组的每个元素都是一个vector类型的变量。这个v[n]可以理解为一维长度是n,这个n需要是已知参数,才算一维长度不变,二维长度可变的矩阵。

运行:
	vector<int> v[5];
	v[0].push_back(-1);
	cout << v[0].size() << " " << v[4].size() << endl;
	cout << v[0][0];
	
输出为:
1 0
-1
1
2

如果想要定义一个两个维度都可变的矩阵,应该使用:vector<vector<int> > arr两个箭头(>>)要分开写(> >), 避免和移位运算符混淆。

如何建立二维数组以及输入数据:
需要绕个弯,先建立一个二维数组vector<vector<int>> res;

	 for (int i = 0; i < N; ++i) {
	    vector<int> temp;
	     for (int j = 0; j < M; ++j) {
	         tmp.push_back(xxx);
	     }
	     res.push_back(tmp);
	 }

以及二维数组如何输入数据:

for(int i=0;i<n;i++){	
		vector<cood> cod;
		for(int j=0;j<t;j++){
			cood c;
			int a1,a2;
			cin>>a1>>a2;
			c.x=a1;
			c.y=a2;
			cod.push_back(c);
		}
		int len = cod.size();
		int flag[len] = {0};
		for(int j=0;j<t;j++){
		//要一行行的,不是arr[i][j].x
			if(cod[j].x>=xl && cod[j].x<=xr && cod[j].y>=yd && cod[j].y<=yu){
				flag[j] = 1;
			}
		}

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是 SM2 密码算法中的密钥派生函数,用于从给定的 Z 值派生出指定长度的密钥 K。其中涉及到了一些数学运算,包括加法、乘法、减法等。下面是对该代码的改进建议: 1. 使用更加安全的随机数生成器生成 ct_bytes,以增强密钥的随机性。 2. 在计算 t 的过程中,可以考虑使用椭圆曲线点乘运算,而不是使用模幂运算,以提高计算效率。 3. 可以使用位运算代替除法和取模运算,以提高计算速度。 4. 可以使用常量时间运算,以防止侧信道攻击。 下面是改进后的代码: ``` vector<int> sm2_kdf(vector<int> Z, int klen) { vector<int> K; int ct = 1; vector<int> h(32, 0); // 初始化为全零向量 while (K.size() < klen) { vector<int> ct_bytes(4, 0); // 使用安全的随机数生成器生成 ct_bytes // 这里使用 C++11 自带的随机数生成器 random_device rd; mt19937 gen(rd()); uniform_int_distribution<> dis(0, 255); for (int i = 0; i < 4; ++i) { ct_bytes[i] = dis(gen); } h = add(h, ct_bytes); h = add(h, Z); vector<int> t = point_multiply(G, ct, a, p); t = add(t, point_multiply(public_key, h, a, p), a, p); vector<int> k = sub(h, t, n); K.insert(K.end(), k.begin(), k.end()); ++ct; } K.resize(klen); return K; } ``` 改进后的代码使用了更加安全的随机数生成器,使用了椭圆曲线点乘运算代替模幂运算,使用了位运算代替除法和取模运算,使用了常量时间运算,提高了密钥派生函数的安全性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值