我不断写一些类似于
的东西std::vector< std::vector< double > > A(N, std::vector< double >(M));
我想用
之类的东西替换它matrix A(N,M);
使用#define
指令。我查看了#define directives并认为我可以创建一个像matrix(A,N,M)
这样的函数来声明vector
vectors
,如下所示:
#define matrix(A, N, M) std::vector< std::vector< double > > A(N, std::vector< double >(M))
但我不想将我的矩阵声明为matrix(A,N,M)
,而是matrix A(N,M)
。我的问题是 - 如何使用#define
指令来考虑更改变量名称?
答案 0 :(得分:1)
您可以使用typedef
并定义类型,类似:
#include <vector>
using namespace std;
int main()
{
int N = 10;
typedef std::vector< std::vector<double> matrix;
matrix A(N, std::vector< double >(N));
return 0;
}
或更安全(如果您不知道,该矩阵将是正确的)
int main()
{
int N = 10;
typedef std::vector< std::array<double, 5> > matrix;
matrix A(N, std::array< double , 5 >());
return 0;
}
我的带矢量矩阵的包装器
#include <iostream>
#include <vector>
#include <exception>
#include <algorithm>
template< typename T >
class WrapperMatrix
{
public:
WrapperMatrix(const int& weight, const int& length);
void pushLine(const std::vector<T>&&);
void pushColumn(const std::vector<T>&&);
void display();
private:
std::vector<std::vector<T>> matrix;
};
template<typename T>
WrapperMatrix<T>::WrapperMatrix(const int& weight, const int& length)
{
this->matrix = std::vector<std::vector<T>>(weight, std::vector<T>(length));
}
template <typename T>
void WrapperMatrix<T>::pushLine(const std::vector<T>&& newLine)
{
if (newLine.size() == this->matrix.at(0).size())
matrix.emplace_back(std::move(newLine));
else
throw std::invalid_argument("Invalis syntax");
}
template <typename T>
void WrapperMatrix<T>::pushColumn(const std::vector<T>&& newColumn)
{
if (newColumn.size() == this->matrix.size())
{
for (int i = 0; i < matrix.size(); ++i)
matrix.at(i).emplace_back(std::move(newColumn.at(i)));
}
else
throw std::invalid_argument("Invalid syntax");
}
template<typename T>
void WrapperMatrix<T>::display()
{
for (int i = 0; i < matrix.size(); ++i)
{
for (int j = 0; j < matrix.at(0).size(); ++j)
std::cout << matrix.at(i).at(j);
std::cout << std::endl;
}
}
int main()
{
std::vector<int> v1{ 1,2,3,4,5 };
std::vector<int> v2{ 1,2,3,4,5,6 };
std::vector<int> v3{ 2,3,4,5,6 };
WrapperMatrix<int> vw(5,5);
try {
vw.pushLine(std::move(v1));
vw.pushColumn(std::move(v2));
//vw.pushLine(std::move(v3));
}
catch (const std::exception& e)
{
std::cout << e.what() << std::endl;
}
vw.display();
return 0;
}
答案 1 :(得分:0)
typedef
using matrix = std::vector< std::vector<double>>;
此表单更具可读性,尤其是函数和数组类型。例如。 using arr10 = Foo[10]
比typedef Foo arra10[10]
更清晰。 =符号清楚地区分了所定义的内容及其定义方式。
(忽略整个&#34;矩阵不是向量的矢量&#34;讨论)