我必须在不知道大小的情况下声明一个数组或多维数组。 我希望在这种情况下用简单的数组做类似的事情:
int *array;
cin >> size;
array = new int[size];
也许我可以做一个循环来初始化像这样的指针指针:
int **array;
cin >> rows >> col;
array = new *int[rows]
for (int i = 0; i < rows; ++i)
array[i] = new int[col];
但如果可能有更好的解决方案,我更愿意不这样做。
答案 0 :(得分:5)
为什么不使用std :: vector?
std::vector<std::vector<int> > array;
如果您不想使用指针数组,可以使用一个大型数组,在获得大小后动态分配,并将其作为行数组访问。
int rows = 10;
int columns = 20;
int* array = new int[rows * columns];
for (int count = 0; count < rows; count++)
{
int* row = &array[count * columns];
for (int inner_count = 0; inner_count < columns; inner_count++)
{
int* element = &row[inner_count];
//do something
}
}
delete [] array;
答案 1 :(得分:1)
你几乎不得不使用循环版本。您可以进行一点改进,即分配一个大块,然后在其中构建自己的int*
索引:
int **array;
int *storage;
cin >> rows >> col;
array = new *int[rows];
storage = new int[rows*col];
for (int i = 0; i < rows; ++i)
array[i] = storage + col * i;
这有一个很好的属性,你仍然可以使用array[i][j]
语法来访问数组。
答案 2 :(得分:0)
如果您关心,可以通过帮助
获得更多便利template <typename T>
struct C3DArray
{
vector<vector<vector<T>>> m;
C3DArray(int size_x, int size_y, int size_z)
: m(make(T(), size_z, size_y, size_x))
{ }
template <typename U> static std::vector<U> make(U v, size_t n) {
return { n, std::move(v) };
}
template <typename U, typename... Dim> static auto make(U v, size_t n, Dim... other)
-> std::vector<decltype(make(v, other...))> {
return { n, make(v, other...) };
}
};
这使用了可变参数。像这样使用它:
C3DArray<int> arr(3,4,20);
答案 3 :(得分:0)
您可以使用单个std :: vector来包含整个二维数组,并将其包装在类中以隐藏详细信息。这是一个示例,它使用data( row, col )
成员函数返回对row
和col
元素的引用。我添加了int
的示例二维矩阵,其中数组中的每个条目都初始化为其row
和col
的乘积。当此类的实例超出范围时,将调用默认析构函数并释放内存,这样您就不必记住调用delete []来释放内存。矩阵的所有元素在内存中都是连续的,这是缓存友好的,应该会给你带来良好的性能。
#include <iostream>
#include <vector>
#include <stdexcept>
template <typename T>
class matrix {
std::vector<T> data_;
public:
size_t const rows_;
size_t const cols_;
matrix(size_t rows, size_t cols)
: rows_(rows)
, cols_(cols)
, data_( rows * cols )
{}
T& data( size_t row, size_t col ) {
if (row > rows_ || col > cols_) throw std::out_of_range("matrix");
return data_[ row * cols_ + col ];
}
};
int main( int argc, char** argv )
{
matrix<int> array(100,100);
for(size_t r=0; r < array.rows_; ++r) {
for(size_t c=0; c < array.cols_; ++c) {
array.data(r,c) = r * c;
}
}
std::cout << "8 x 7 = " << array.data(8,7) << std::endl;
return 0; // array goes out of scope here, memory released automatically
}
当你运行它时,你会得到
8 x 7 = 56