目前有什么替代std :: dynarray吗?

Ste*_*ppo 15 c++ c++11 c++14

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您将避免重新分配开销.

  • @ user814628:假设库实现能够在`std :: dynarray`的情况下分配堆栈中的元素,这将使它更接近C中的VLA.如果是这样的话,那么`dynarray `不会产生分配成本,但实施`dynarray`(至少作为一个库)并非易事. (5认同)
  • @DavidRodríguez-dribeas给定一个\常数`n`,如何在运行时在堆栈上分配`n-elements`? (2认同)

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)

  • @andre这是不一样的.*嗅出*.另外,你必须记住某个地方的"3",这是"dynarray"记得的. (4认同)
  • 但是......你不能使用漂亮的`for`循环语法! (2认同)
  • @Yakk真的是......;)但你可以使用std :: for_each(myarray.get(),myarray.get()+ 3,[](短val){std :: cout << val <<"\n";}); (2认同)

ken*_*ytm 5

你可以(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++ 中它被实现为(开始,结束)。)

  • 我会说 dynarray 的情况更多是关于防御性编程而不是关于优化——它不应该*可能*调整一个没有调整业务大小的数组。 (6认同)
  • 对于使用正确的重载创建的 `std::vector` 并且只使用 `operator[]` 访问元素,您只是在切割一个数据成员(容量)。这对我来说 * 很像 * 过早的优化...... (2认同)