如何制作一个动态大小的双int数组
How to make a dynamically-sized double-int array?
我正试图用C++制作一个通用矩阵结构,但现在我只得到
struct matrix{
int cells[dim][dim];
}
其中dim是常数int.
然而,我希望使事情更加动态,这样我就可以声明不同大小的矩阵。我可以通过将所有内容转换为int向量的向量来解决这个问题,但随后我会遭受巨大的速度损失。
您也可以为矩阵类使用一个向量,它工作得很好,因为数据将是顺序的,这取决于基于行或列的存储。例如
Struct Matrix {
std::vector<int> cells;
int nrows, ncols;
Matrix(int rows, int cols) : cells(rows * cols), nrows(rows), ncols(cols)
{}
int& operator()(int row, int col){
return cells[row * ncols + col];
}
void resize(int rows, int cols){
cells.resize(rows*cols);
nrows = rows;
ncols = cols;
}
}
这是一个很好的矩阵向量包装器,可以避免使用c样式的东西。
FWIW我总是使用平面矢量(预先保留/调整大小)或Boost MultiArray。
但是,模板有什么问题?
template<typename T, size_t N, size_t M=N>
struct matrix {
typedef T row_type[M];
row_type cells[N];
row_type* begin() { return std::begin(cells); }
row_type* end() { return std::end(cells); }
row_type const* begin() const { return std::begin(cells); }
row_type const* end() const { return std::end(cells); }
};
甚至更好,使用std::array
:
#include <array>
template<typename T, size_t N, size_t M=N>
struct matrix {
typedef std::array<T, M> row_type;
std::array<row_type, N> cells;
row_type* begin() { return cells.begin(); }
row_type* end() { return cells.end(); }
row_type const* begin() const { return cells.begin(); }
row_type const* end() const { return cells.end(); }
};
只是一个俗气的演示来展示它的通用性:在Coliru上直播
#include <algorithm>
template<size_t N, typename T=int>
T test()
{
using std::begin;
using std::end;
typedef matrix<T, N, N*3+2> Mtx;
Mtx the_matrix;
size_t next_gen {};
auto gen = [&](){ return next_gen++ * 3.14; };
for(auto& row : the_matrix)
std::generate(begin(row), end(row), gen);
return std::accumulate(
begin(the_matrix), end(the_matrix), T{},
[](T accum, typename Mtx::row_type& row)
{
return accum + std::accumulate(begin(row), end(row), T{});
});
}
#include <iostream>
#include <string>
int main()
{
std::cout << test<3, int>() << "n";
std::cout << test<3, double>() << "n";
}
我可以通过将所有内容转换为int向量的向量来解决这个问题,但随后我会遭受巨大的速度损失。
人造的这是错误的std::vector
几乎和原始数组一样快请使用vector<vector<int> >
但是,如果您仍然坚持使用原始阵列:
int **p = new int *[rows];
for (size_t i = 0; i < rows; i++)
p[i] = new int[columns];
释放:
for (size_t i = 0; i < rows; i++)
delete [] p[i];
delete [] p;
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 按字符值访问int数组
- 将 int 数组转换为 std::vector<int*>
- 比较if语句中的数组值和int值
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 在c++中获取两个大int,并将它们存储在数组中
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 有没有办法用 2D 数组 (int) 重载构造函数?
- 当大小未知时,如何迭代指向数组 (int*) 的指针?
- 接受来自函数的二维数组(int 类型)并将其返回到主函数
- 数组 + int 作为一个参数做什么
- 如何制作'bit'数组而不是数组'int'?
- 动态2d数组:int(*ptr)[4]=new int[7][4];
- 为[z][y][x]int定义数组int[x][y][z]有什么好处?
- 用Visual c++编写二维数组int[n][m]到HDF5文件
- 数组int未正确返回
- 将元素推送到动态分配的指针数组int C++
- 如何在另一个数组中插入多维数组(int而非char)
- 将数组(int*)设置为NULL是否释放其占用的内存
- C++如何将数组 int[10] push_back std::vector<int[10]>?