所以我正在编写一个具有1d数组和2d数组的类,我在构造函数中动态分配
class Foo{
int** 2darray;
int * 1darray;
};
Foo::Foo(num1, num2){
2darray = new int*[num1];
for(int i = 0; i < num1; i++)
{
array[i] = new int[num2];
}
1darray = new int[num1];
}
然后我将在析构函数中删除每个1d数组和2d数组中的每个数组,对吧? 我想使用std :: vector不必这样做。这样做有什么缺点吗? (使编译更慢等?)
TL; DR:何时将std :: vector用于动态分配的数组,在运行时不需要调整大小?
答案 0 :(得分:3)
vector
适用于绝大多数用途。手动调整的场景应首先尝试调整分配器 1 ,然后才能修改容器。内存管理(以及您的程序)的正确性非常值,远远超过任何编译时间。
换句话说,vector
应该是你的起点,直到你发现它不能令人满意,你不应该关心其他任何事情。
作为额外的改进,请考虑使用1维vector
作为后端存储,并仅提供2维索引视图。这种情况可以改善缓存局部性和整体性能,同时还可以更轻松地复制整个结构等操作。
1 vector
接受的两个模板参数中的第二个,默认为给定类型的标准分配器。
答案 1 :(得分:2)
由于vector可以保证连续的内存,所以不应该有任何缺点。但是如果大小是固定的并且C ++ 11可用,那么可能还有array个选项:
vector
的方式阻止重新分配答案 2 :(得分:0)
2D数组不是指针数组。 如果以这种方式定义它,每个行/列可以具有不同的大小。 此外,元素将不会按顺序存储在内存中。 这可能导致性能不佳,因为预取器无法很好地预测您的访问模式。 因此,不建议将std :: vectors嵌套在彼此内部以模拟多维数组。 更好的方法是通过提供自定义访问方法将连续的内存块映射到多维空间。
您可以在浏览器中对其进行测试:http://fiddle.jyt.io/github/3389bf64cc6bd7c2218c1c96f62fa203
#include<vector>
template<class T>
struct Matrix {
Matrix(std::size_t n=1, std::size_t m=1)
: n{n}, m{m}, data(n*m)
{}
Matrix(std::size_t n, std::size_t m, std::vector<T> const& data)
: n{n}, m{m}, data{data}
{}
//Matrix M(2,2, {1,1,1,1});
T const& operator()(size_t i, size_t j) const {
return data[i*m + j];
}
T& operator()(size_t i, size_t j) {
return data[i*m + j];
}
size_t n;
size_t m;
std::vector<T> data;
using ScalarType = T;
};
您可以通过返回一个可以访问索引和维度数据的VectorView来实现operator []。