c++11 std::array vs static array vs std::vector
c++11 std::array vs static array vs std::vector
第一个问题,如果我要为接下来的 3 年开发代码,开始使用 c++11 是一件好事吗?
如果是这样,如果我想将其与 Lapack 一起使用,实现矩阵的"最佳"方法是什么?我的意思是,做std::vector<std::vector< Type > > Matrix
与Lapack不容易兼容。
到目前为止,我将矩阵与Type* Matrix(new Type[N])
一起存储(带有new
和delete
的指针形式很重要,因为数组的大小不是像 5 那样作为数字给出的,而是作为变量给出的)。
但是对于 C++11,可以使用 std::array。根据这个网站,这个容器似乎是最好的解决方案......你觉得怎么样?
首先,如果你要学习C++,请学习C++11。之前的C++标准是在2003年发布的,这意味着它已经有十年的历史了。这在 IT 世界中很多。C++11技能也将顺利转化为即将到来的C++1y(很可能是C++14)标准。
std::vector
和std::array
之间的主要区别在于动态(大小和分配)和静态存储。因此,如果你想拥有一个总是 4x4 的矩阵类,std::array<float, 4*4>
就可以了。
这两个类都提供.data()
成员,该成员应生成兼容的指针。但请注意,std::vector<std::vector<float>>
不会占用连续的16*sizeof(float)
内存(因此v[0].data()
不起作用)。如果需要动态大小的矩阵,请使用单个vector
并将其大小调整为width*height
大小。
由于对元素的访问会有点困难(v[width * y +x]
或v[height * x + y]
),你可能希望提供一个包装类,允许你按行/列对访问任意字段。
既然你也提到了 C 风格的数组; std::array
提供了更好的界面来处理相同类型的存储,因此应该是首选;静态数组在std::array
上没有任何好处。
这是对这个问题的很晚的回答,但如果有人读到这篇文章,我只想指出,几乎永远不应该将矩阵实现为"向量向量"。原因是矩阵的每一行都存储在堆上的某个随机位置。这意味着矩阵操作将执行大量随机内存访问,从而导致缓存未命中,这会大大减慢实现速度。
换句话说,如果你关心性能,只需分配大小rows * columns
的array/std::array/std::vector
,然后使用包装函数将一对整数转换为数组中的相应元素。除非你需要支持诸如返回对矩阵行的引用之类的东西,否则所有这些选项都应该可以正常工作。
- std::array<const T, n> vs std::array<T, n> 过载分辨率
- char array[sizeof(Message)]; vs char* array = new char[sizeo
- std::move(std::array) g++ vs visual-c++
- 固定大小的 std::span vs std::array
- std::span.size() vs array/vector size
- std::array<bool> vs. std::vector <bool>的行为
- 使用 std::array vs 数组传递对象数组
- `Array[i]` vs `Array+i`
- C++ performance std::array vs std::vector
- C++ vs C# - array
- JNI GetDirectBufferAddress vs. ByteBuffer.array()
- C++ std::map vs dynamic array
- std::vector vs std::array performance
- std::tuple vs std::array 作为 std::vector 的项目
- c++11 std::array vs static array vs std::vector
- glBufferData with explicit array vs non explicit array
- std::array - "大小为 n 的缓冲区将被溢出",仅在 VS 中
- std::pair vs Array
- Vector vs. Array for Deck of Cards
- Array[n]vs Array[10]-使用变量与数字文本初始化数组