C++ 11给了我们很棒std::array,这需要在编译时知道大小:
std::array<int, 3> myarray = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
现在,我碰巧有一些旧的short*缓冲区要包装,其大小将在运行时才知道(当然它将是).
C++ 14将定义std::dynarray为涵盖这种情况,但dynarray在GCC 4.7和Clang 3.2中尚不可用.
那么,有没有人知道一个与std::array(在效率方面)相当但不需要在编译时指定大小的容器?我怀疑Boost已经为我做好了准备,虽然我找不到任何东西.
Mar*_*k B 17
我认为这std::vector是你在找到之前所期待的dynarray.只需使用分配构造函数或者reserve您将避免重新分配开销.
Jon*_*rdy 10
std::unique_ptr<short[]>(new short[n])如果您不需要提供的范围检查访问权限,我会投票std::dynarray<T>::at().您甚至可以使用初始化列表:
#include <iostream>
#include <memory>
int main(int argc, char** argv) {
const size_t n = 3;
std::unique_ptr<short[]> myarray(new short[n]{ 1, 2, 3 });
for (size_t i = 0; i < n; ++i)
std::cout << myarray[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
你可以(ab)使用一个std::valarray<short>.
int main() {
short* raw_array = (short*) malloc(12 * sizeof(short));
size_t length = 12;
for (size_t i = 0; i < length; ++ i) {
raw_array[i] = (short) i;
}
// ...
std::valarray<short> dyn_array (raw_array, length);
for (short elem : dyn_array) {
std::cout << elem << std::endl;
}
// ...
free(raw_array);
}
Run Code Online (Sandbox Code Playgroud)
valarray支持 a 的大部分功能dynarray,除了:
.at().data()请注意,标准(从 n3690 开始)不要求valarray存储是连续的,尽管没有理由不这样做:)。
(对于一些实现细节,在 libstdc++ 中它被实现为(长度,数据)对,而在 libc++ 中它被实现为(开始,结束)。)