-1

需要一些关于 C++ 中的动态数组的帮助

我所拥有的是一个动态的指针数组,即

Node* nodes;

以及向该数组添加新节点的函数。

void insertNode(Node* nodeT){
   nodes = new nodeT;
}

现在我的逻辑可能完全错误,因为我知道执行以下操作会起作用,但我想知道是否有更好的方法而不使用 STL

Node * nodes = new Node(arg);

感谢您提前提供任何帮助。

4

3 回答 3

3

下面nodes只表示一个指向一个 Node 对象的指针。

Node * nodes = new Node(arg);

要在多个节点上获取数组,您必须告诉编译器生成一个数组:

Node * nodes = new Node[size]();

然后你可以像这样插入新对象

node[0] = ...
node[1] = ...

或者,当您无法提前确定节点数量时,您可以使用std::vector.

于 2013-10-12T09:00:00.517 回答
1

取决于你需要你的指针。您可以使用:

  1. 指针数组
    • 易于重新分配
    • 轻松访问(索引)
  2. 对象数组
    • 几乎与1相同。但是:
    • 需要非常小心地使用对象构造函数/析构函数以避免内存泄漏和冲突
    • 较慢的重新分配和插入/删除
    • 访问速度非常快
    • 内存中的线性布局(可以加速很多事情)
  3. 链表
    • 轻松快速地添加/插入/删除项目
    • 访问速度慢(需要通过链条)
    • 众所周知的事情......可以随时使用包含源代码的谷歌搜索

我个人更喜欢选项2。

  • 有一个与 { T *dat; 相同的模板 List< class T > 整数,大小;}
  • dat 是对象的线性数组
  • num 是使用对象的实际计数
  • siz 是实际分配的数组大小
  • 将 (T a) 添加到结尾:dat[num]=a; 数++;
  • 将 (T a) 插入 (int ix): for (i=num;i>ix;i--) dat[i]=dat[i-1]; 数据[ix]=a;数++;
  • 删除 (int ix): for (i=ix;i < num;i++) dat[i]=dat[i+1]; 数——;
  • 重新分配:siz<<=1; T *tmp=新的 T[siz]; 对于 (i=0;i
  • 重新分配:siz>>=1;T *tmp=新的 T[siz]; 对于 (i=0;i
  • 不要忘记添加范围检查
  • 当 num 达到 siz 或 siz/2 时,将 siz 重新分配为两倍或一半大小(或者比 num 更大的东西会增加滞后)
  • 不要忘记使用delete[] dat;而不是删除数据;!!!
  • 一个; 需要实现 a(),~a() 和 a*=a; 或 a&=a;
  • 当正确实现 [] 运算符时,也可以用作多维数组
  • 在 List 析构函数上释放内存
  • 添加分配功能以加快列表的使用(在已知大小时避免重定位)

选项 1 与选项 2 非常相似,但不是 (T *dat) 而是 (T **dat)

  • 需要额外的新/删除每一个项目
  • 通过两个指针项 ix = *dat[ix] 或 dat[ix][0] 寻址
  • 插入/删除/重定位只复制指针而不是对象(非常快)

PS 我知道你们中的大多数人会使用 std 来代替(所以请不要判断),但我已经使用了将近 20 年,并且还在没有 std 存在的平台上使用它。已知的功能/行为已经多次证明对我来说是一件好事,可以在时间和安全关键应用程序上进行。

希望能帮助到你

于 2013-10-12T09:16:30.590 回答
0

我建议使用std::vector而不是传统的数组:

  1. std::vector是安全数组。
  2. 它是STL的成员。
  3. 您可以使用 lambda 函数和另一个函数轻松地对其进行迭代。
  4. 您的代码不会有任何垃圾内存。
  5. 等等。

请拜访:

矢量参考

于 2013-10-12T09:53:25.703 回答