用到的C++的相关知识-----未完待续


前言

只是为方便学习,不做其他用途

一、vector函数的使用

有关的文章

  1. C++ vector的用法(整理)
  2. C++中vector的用法详解

1.1 构造向量

	//vector():创建一个空vector
	vector<int> v1 = vector<int>();                         //v1 = []

	//vector(int nSize):创建一个vector,元素个数为nSize
	vector<int> v2 = vector<int>(3);                        //v2 = [0, 0, 0]

	//vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t
	vector<int> v3 = vector<int>(3, 10);                    //v3 = [10, 10, 10]

	//vector(const vector&):                                复制构造函数
	vector<int> v4 = vector<int>(v3);                       //v4 = [10, 10, 10]

	//vector(begin,end):  复制[begin,end)区间内另一个数组的元素到vector中
	vector<int> v5 = vector<int>(v4.begin(), v4.end() - 1); //v5 = [10, 10]
	
	vector<vector<int>> v6 = vector<vector<int>>(3, vector<int>(3););    
	//v6 = [[0, 0, 0][0, 0, 0][0, 0, 0]]

二、常用函数

2.1 矩阵输出函数

// 输出矩阵的各个值
void Print(MatrixXd K)
{
	for (int j = 0; j < K.rows(); j++)
	{
		for (int i = 0; i < K.cols(); i++)
		{
			cout << K(j, i) << "  ";
		}
		cout << endl;
	}
}

2.2 向量输出函数

#include <vector>
// 输出向量的各个值
void Print_Vector(vector<double> U)
{
    for (int i = 0; i < U.size(); i++)
    {
        cout << " U_ " << i << " = " << U[i] << endl;
    }
}

2.3 矩阵的使用

eigen库和matlab中对应命令

// A simple quickref for Eigen. Add anything that's missing.
// Main author: Keir Mierle
#include<iostream>
#include <gismo.h>
#include <Eigen/Dense>
using namespace Eigen;
using namespace gismo;
using namespace std;
#include <vector>



int main()
{
	gsMatrix<double, 3, 3> A;               // Fixed rows and cols. Same as Matrix3d.
	Matrix<double, 3, Dynamic> B;         // Fixed rows, dynamic cols.
	Matrix<double, Dynamic, Dynamic> C;   // Full dynamic. Same as MatrixXd.
	Matrix<double, 3, 3, RowMajor> E;     // Row major; default is column-major.
	Matrix3f P, Q, R;                     // 3x3 float matrix.
	Vector3f x, y, z;                     // 3x1 float matrix.
	RowVector3f a, b, c;                  // 1x3 float matrix.
	VectorXd v;                           // Dynamic column vector of doubles
	double s;

	// Basic usage
	// Eigen          // Matlab           // comments
	x.size()          // length(x)        // vector size
	C.rows()          // size(C,1)        // number of rows
	C.cols()          // size(C,2)        // number of columns
	x(i)              // x(i+1)           // Matlab is 1-based
	C(i, j)            // C(i+1,j+1)       //

	A.resize(4, 4);   // Runtime error if assertions are on.
	B.resize(4, 9);   // Runtime error if assertions are on.
	A.resize(3, 3);   // Ok; size didn't change.
	B.resize(3, 9);   // Ok; only dynamic cols changed.

	A << 1, 2, 3,     // Initialize A. The elements can also be
		4, 5, 6,     // matrices, which are stacked along cols
		7, 8, 9;     // and then the rows are stacked.
	B << A, A, A;     // B is three horizontally stacked A's.
	A.fill(10);       // Fill A with all 10's.

	// Eigen                            // Matlab
	MatrixXd::Identity(rows, cols)       // eye(rows,cols)
	C.setIdentity(rows, cols)            // C = eye(rows,cols)
	MatrixXd::Zero(rows, cols)           // zeros(rows,cols)
	C.setZero(rows, cols)                // C = ones(rows,cols)
	MatrixXd::Ones(rows, cols)           // ones(rows,cols)
	C.setOnes(rows, cols)                // C = ones(rows,cols)
	MatrixXd::Random(rows, cols)         // rand(rows,cols)*2-1        // MatrixXd::Random returns uniform random numbers in (-1, 1).
	C.setRandom(rows, cols)              // C = rand(rows,cols)*2-1
	VectorXd::LinSpaced(size, low, high)   // linspace(low,high,size)'
	v.setLinSpaced(size, low, high)        // v = linspace(low,high,size)'


		// Matrix slicing and blocks. All expressions listed here are read/write.
		// Templated size versions are faster. Note that Matlab is 1-based (a size N
		// vector is x(1)...x(N)).
		// Eigen                           // Matlab
		x.head(n)                          // x(1:n)
		x.head<n>()                        // x(1:n)
		x.tail(n)                          // x(end - n + 1: end)
		x.tail<n>()                        // x(end - n + 1: end)
		x.segment(i, n)                    // x(i+1 : i+n)
		x.segment<n>(i)                    // x(i+1 : i+n)
		P.block(i, j, rows, cols)          // P(i+1 : i+rows, j+1 : j+cols)
		P.block<rows, cols>(i, j)          // P(i+1 : i+rows, j+1 : j+cols)
		P.row(i)                           // P(i+1, :)
		P.col(j)                           // P(:, j+1)
		P.leftCols<cols>()                 // P(:, 1:cols)
		P.leftCols(cols)                   // P(:, 1:cols)
		P.middleCols<cols>(j)              // P(:, j+1:j+cols)
		P.middleCols(j, cols)              // P(:, j+1:j+cols)
		P.rightCols<cols>()                // P(:, end-cols+1:end)
		P.rightCols(cols)                  // P(:, end-cols+1:end)
		P.topRows<rows>()                  // P(1:rows, :)
		P.topRows(rows)                    // P(1:rows, :)
		P.middleRows<rows>(i)              // P(i+1:i+rows, :)
		P.middleRows(i, rows)              // P(i+1:i+rows, :)
		P.bottomRows<rows>()               // P(end-rows+1:end, :)
		P.bottomRows(rows)                 // P(end-rows+1:end, :)
		P.topLeftCorner(rows, cols)        // P(1:rows, 1:cols)
		P.topRightCorner(rows, cols)       // P(1:rows, end-cols+1:end)
		P.bottomLeftCorner(rows, cols)     // P(end-rows+1:end, 1:cols)
		P.bottomRightCorner(rows, cols)    // P(end-rows+1:end, end-cols+1:end)
		P.topLeftCorner<rows, cols>()       // P(1:rows, 1:cols)
		P.topRightCorner<rows, cols>()      // P(1:rows, end-cols+1:end)
		P.bottomLeftCorner<rows, cols>()    // P(end-rows+1:end, 1:cols)
		P.bottomRightCorner<rows, cols>()   // P(end-rows+1:end, end-cols+1:end)

		// Of particular note is Eigen's swap function which is highly optimized.
		// Eigen                           // Matlab
		R.row(i) = P.col(j);               // R(i, :) = P(:, i)
	    R.col(j1).swap(mat1.col(j2));      // R(:, [j1 j2]) = R(:, [j2, j1])

	// Views, transpose, etc; all read-write except for .adjoint().
	    // Eigen                           // Matlab
	    R.adjoint()                        // R'
		R.transpose()                      // R.' or conj(R')
		R.diagonal()                       // diag(R)
		x.asDiagonal()                     // diag(x)
		R.transpose().colwise().reverse(); // rot90(R)
	    R.conjugate()                      // conj(R)

	// All the same as Matlab, but matlab doesn't have *= style operators.
	// Matrix-vector.  Matrix-matrix.   Matrix-scalar.
	y = M * x;          R = P * Q;        R = P * s;
	a = b * M;          R = P - Q;      R = s * P;
	a *= M;            R = P + Q;      R = P / s;
	R *= Q;          R = s * P;
	R += Q;          R *= s;
	R -= Q;          R /= s;

	// Vectorized operations on each element independently
	// Eigen                  // Matlab
	R = P.cwiseProduct(Q);    // R = P .* Q
	R = P.array() * s.array();// R = P .* s
	R = P.cwiseQuotient(Q);   // R = P ./ Q
	R = P.array() / Q.array();// R = P ./ Q
	R = P.array() + s.array();// R = P + s
	R = P.array() - s.array();// R = P - s
	R.array() += s;           // R = R + s
	R.array() -= s;           // R = R - s
	R.array() < Q.array();    // R < Q
	R.array() <= Q.array();   // R <= Q
	R.cwiseInverse();         // 1 ./ P
	R.array().inverse();      // 1 ./ P
	R.array().sin()           // sin(P)
		R.array().cos()           // cos(P)
		R.array().pow(s)          // P .^ s
		R.array().square()        // P .^ 2
		R.array().cube()          // P .^ 3
		R.cwiseSqrt()             // sqrt(P)
		R.array().sqrt()          // sqrt(P)
		R.array().exp()           // exp(P)
		R.array().log()           // log(P)
		R.cwiseMax(P)             // max(R, P)
		R.array().max(P.array())  // max(R, P)
		R.cwiseMin(P)             // min(R, P)
		R.array().min(P.array())  // min(R, P)
		R.cwiseAbs()              // abs(P)
		R.array().abs()           // abs(P)
		R.cwiseAbs2()             // abs(P.^2)
		R.array().abs2()          // abs(P.^2)
		(R.array() < s).select(P, Q);  // (R < s ? P : Q)

	// Reductions.
	int r, c;
	// Eigen                  // Matlab
	R.minCoeff()              // min(R(:))
		R.maxCoeff()              // max(R(:))
		s = R.minCoeff(&r, &c)    // [s, i] = min(R(:)); [r, c] = ind2sub(size(R), i);
		s = R.maxCoeff(&r, &c)    // [s, i] = max(R(:)); [r, c] = ind2sub(size(R), i);
		R.sum()                   // sum(R(:))
		R.colwise().sum()         // sum(R)
		R.rowwise().sum()         // sum(R, 2) or sum(R')'
		R.prod()                  // prod(R(:))
		R.colwise().prod()        // prod(R)
		R.rowwise().prod()        // prod(R, 2) or prod(R')'
		R.trace()                 // trace(R)
		R.all()                   // all(R(:))
		R.colwise().all()         // all(R)
		R.rowwise().all()         // all(R, 2)
		R.any()                   // any(R(:))
		R.colwise().any()         // any(R)
		R.rowwise().any()         // any(R, 2)

		// Dot products, norms, etc.
		// Eigen                  // Matlab
		x.norm()                  // norm(x).    Note that norm(R) doesn't work in Eigen.
		x.squaredNorm()           // dot(x, x)   Note the equivalence is not true for complex
		x.dot(y)                  // dot(x, y)
		x.cross(y)                // cross(x, y) Requires #include <Eigen/Geometry>

		// Eigen                           // Matlab
		A.cast<double>();                  // double(A)
	A.cast<float>();                   // single(A)
	A.cast<int>();                     // int32(A)
	A.real();                          // real(A)
	A.imag();                          // imag(A)
	// if the original type equals destination type, no work is done

	// Note that for most operations Eigen requires all operands to have the same type:
	MatrixXf F = MatrixXf::Zero(3, 3);
	A += F;                // illegal in Eigen. In Matlab A = A+F is allowed
	A += F.cast<double>(); // F converted to double and then added (generally, conversion happens on-the-fly)

	// Eigen can map existing memory into Eigen matrices.
	float array[3];
	Vector3f::Map(array).fill(10);            // create a temporary Map over array and sets entries to 10
	int data[4] = { 1, 2, 3, 4 };
	Matrix2i mat2x2(data);                    // copies data into mat2x2
	Matrix2i::Map(data) = 2 * mat2x2;           // overwrite elements of data with 2*mat2x2
	MatrixXi::Map(data, 2, 2) += mat2x2;      // adds mat2x2 to elements of data (alternative syntax if size is not know at compile time)

	// Solve Ax = b. Result stored in x. Matlab: x = A \ b.
	x = A.ldlt().solve(b));  // A sym. p.s.d.    #include <Eigen/Cholesky>
	x = A.llt().solve(b));  // A sym. p.d.      #include <Eigen/Cholesky>
	x = A.lu().solve(b));  // Stable and fast. #include <Eigen/LU>
	x = A.qr().solve(b));  // No pivoting.     #include <Eigen/QR>
	x = A.svd().solve(b));  // Stable, slowest. #include <Eigen/SVD>
	// .ldlt() -> .matrixL() and .matrixD()
	// .llt()  -> .matrixL()
	// .lu()   -> .matrixL() and .matrixU()
	// .qr()   -> .matrixQ() and .matrixR()
	// .svd()  -> .matrixU(), .singularValues(), and .matrixV()

	// Eigenvalue problems
	// Eigen                          // Matlab
	A.eigenvalues();                  // eig(A);
	EigenSolver<Matrix3d> eig(A);     // [vec val] = eig(A)
	eig.eigenvalues();                // diag(val)
	eig.eigenvectors();               // vec
	// For self-adjoint matrices use SelfAdjointEigenSolver<>
}

2.4

三、new的用法

参考文章 c++中new的作用C++如何让函数返回数组

 //可以在new后面直接赋值
    int* p = new int(3);
    //也可以单独赋值
    //*p = 3;

    //如果不想使用指针,可以定义一个变量,在new之前用“*”表示new出来的内容
    int q = *new int;
    q = 1;
    cout << q << endl;

3.1 内存的四种分区

栈区(stack): 编译器自动分配和释放的,主要存储的是函数的参数值,局部变量等值。发生函数调用时就为函数运行时用到的数据分配内存,函数调用结束后就将之前分配的内存全部销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部。栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值,在 VC/VS 下,默认是 1M。

堆区(heap): 动态分配。一般由程序员分配和释放(动态内存申请malloc与释放free),需要手动free。否则会一直存在,若程序员不释放,程序结束时可能由操作系统回收。

全局区(静态区)(static): 静态分配。全局变量和静态变量的存储是放在一块的,该区域在程序结束后由操作系统释放。

代码区:: 通常用来存放程序执行代码(包含类成员函数和全局函数及其他函数代码),这部分区域的大小在程序运行前就已经确定,也有可能包含一些只读的常数变量,例如字符串变量。

3.2 new的作用

在这里插入图片描述

用法示例:

int *a = new int[5];
class A {...}   //声明一个类 A
A *obj = new A();  //使用 new 创建对象
delete []a;
delete obj;

四、C++常用快捷键归纳

4.1 快捷键

查看文章:Dev C++多行注释等常用快捷键归纳

4.2 快捷键单行注释

在这里插入图片描述

4.3

4.4

总结

二维数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值