代码之家  ›  专栏  ›  技术社区  ›  Jason R. Mick

如何在c++中最好地存储非常大的二维浮动列表?错误处理?

  •  0
  • Jason R. Mick  · 技术社区  · 14 年前

    我正在将一些代码从c迁移到c++。

    我换了一些 malloc new 电话。

    基本上在我移植的代码之前,是malloc'ing数组,它包含多组帧坐标,每个帧坐标的长度都有几十万个浮点值,所以数组的总长度可以是几千万个坐标。

    我需要什么样的保护来捕捉与内存相关的错误?


    编辑1

    我想某种类似于二维列表的结构可能会起作用。。。可能是std::deque的std::deque?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Alexandre C.    14 年前

    答案是 std::vector .

    实际上,你不需要那么多内存(或者你有一些内存受限的平台,我想你应该已经告诉我们了)。矢量在这方面是非常好的。你不必自己管理内存。

    但是现在10^6的浮动绝对不是什么大事。

    更新 :如果你同意,还有一件事 deque 不要 接近 德克 很擅长在两边插入,但不擅长通过索引访问对象。可能不会像我在这里看到的那样,在中间插入对象。

        2
  •  1
  •   Naveen    14 年前

    通过分配时 new std::bad_alloc . 但你真的报答了这么多吗 floats 连续内存位置。如果不是,您可以查看其他数据结构,例如 std::deque std::list

    : list 当您要求替换阵列时没有意义。

        3
  •  1
  •   Niki Yoshiuchi    14 年前

    编辑:如果你想要一个C++风格的矩阵,那么我会首先推荐 boost::matrix

    boost::matrix<float> my_matrix(n, m);
    

    如果你不能使用boost,那么我推荐一个向量向量。

    std::vector<std::vector<float> > m_matrix(n, std::vector<float>(m));
    

    在结构中间插入新元素方面,Deques也更有效。

    是的,对new的调用可能会失败。通常,如果对new的调用失败,它会抛出std::bad\u alloc异常,您可以捕获该异常。因为您正在将代码从c迁移到c++,所以使用std::nothrow可能更容易,这将导致new返回空指针(很像malloc)。

    try
    {
      my_array = new float[num_points];
    }
    catch(std::bad_alloc &exp)
    {
      ...
    }
    

    my_array = new (std::nothrow) float[num_points];
    if(m_array == NULL)
    {
      ...
    }