标签: dynamic-arrays

递增指向0大小的动态数组的指针是否未定义?

AFAIK,尽管我们无法创建大小为0的静态内存数组,但是我们可以使用动态数组来做到这一点:

int a[0]{}; // Compile-time error
int* p = new int[0]; // Is well-defined
Run Code Online (Sandbox Code Playgroud)

如我所读,p行为就像一个过去的元素。我可以打印p指向的地址。

if(p)
    cout << p << endl;
Run Code Online (Sandbox Code Playgroud)
  • 尽管我确定我们不能像使用迭代器(过去元素)那样取消引用该指针(过去元素),但是我不确定是否要增加该指针p?是否像迭代器一样具有未定义的行为(UB)?

    p++; // UB?
    
    Run Code Online (Sandbox Code Playgroud)

c++ pointers undefined-behavior dynamic-arrays

32
推荐指数
1
解决办法
1707
查看次数

为什么C++不支持堆栈上的动态数组?

在C99这是合法的:

void f(size_t sz) {
    char arr[sz];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.

AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?

我能想到的就是:

优点

  • 允许更智能的阵列大小需要在堆栈上(临时缓冲区?),从而节省内存.
  • 减少"智能指针"(或更糟糕的是,手动错误引入delete [])和慢堆分配.
  • 与C99的兼容性.

缺点

  • 允许人们在堆栈上轻松分配过大的数组,从而产生难以调试的堆栈溢出.
  • 编译器编写者更复杂.

那么,为什么他们在导入其他C99功能时没有包含它?


为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.

而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).


编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".

c++ standards stack dynamic-arrays

30
推荐指数
1
解决办法
6865
查看次数

用于实现堆栈的链接列表与动态数组

我开始在学校最后一年开始之前检查数据结构和算法,以确保我掌握一切.一个评论问题说"使用链表或动态数组实现堆栈并解释为什么你做出了最好的选择".

对我来说,使用带有尾指针的列表来实现堆栈似乎更直观,因为它可能需要经常调整大小.对于大量数据来说,列表是更好的选择,因为动态数组重新调整大小是一项昂贵的操作.此外,使用列表,您不需要分配比实际需要更多的空间,因此它更节省空间.

但是,动态数组肯定允许更快地添加数据(除非需要调整大小).但是,我不确定使用数组是否整体更快,或者只是不需要调整大小.

该书的解决方案说"存储非常大的对象,列表是一个更好的实现",但我不明白为什么.

哪种方式最好?应该使用哪些因素来确定哪种实施方式"最佳"?还有,我的逻辑是什么?

performance stack linked-list dynamic-arrays data-structures

29
推荐指数
2
解决办法
2万
查看次数

指针指针动态二维数组

这个网站上的第一个计时器,所以这里..

我是C++的新手,我目前正在阅读"DS Malik的数据结构使用C++第二版"一书.

在书中,Malik提供了两种创建动态二维数组的方法.在第一种方法中,将变量声明为指针数组,其中每个指针都是整数类型.恩.

int *board[4];
Run Code Online (Sandbox Code Playgroud)

..然后使用for循环创建'列',同时使用指针数组作为'行'.

第二种方法,您使用指针指针.

int **board;
board = new int* [10]; 
Run Code Online (Sandbox Code Playgroud)

等等

我的问题是:哪种方法更好?**方法对我来说更容易可视化,但第一种方法可以大致相同的方式使用.两种方式都可用于制作动态二维数组.

编辑:上面的帖子不够清楚.这是我尝试过的一些代码:

int row, col;

cout << "Enter row size:";
cin >> row;
cout << "\ncol:";
cin >> col;

int *p_board[row];
for (int i=0; i < row; i++)
    p_board[i] = new int[col];

for (int i=0; i < row; i++)
{
    for (int j=0; j < col; j++)
    {
        p_board[i][j] = j;
        cout << p_board[i][j] << " ";
    }
    cout << endl;
}
cout << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers memory-management dynamic-arrays

26
推荐指数
2
解决办法
14万
查看次数

基于范围的动态数组循环?

有一个基于范围的for循环,其语法如下:

for(auto& i : array)
Run Code Online (Sandbox Code Playgroud)

它适用于常量数组,但不适用于基于指针的动态数组

int *array = new int[size];
for(auto& i : array)
   cout<< i << endl;
Run Code Online (Sandbox Code Playgroud)

它给出了有关替换失败的错误和警告,例如:

错误] C:\ Users\Siegfred\Documents\C-Free\Temp\Untitled2.cpp:16:16:错误:没有匹配函数来调用'begin(int*&)'

如何在动态数组中使用这种新语法?

c++ arrays foreach dynamic-arrays c++11

23
推荐指数
4
解决办法
2万
查看次数

将项添加到数组的最快方法

将新项目添加到现有阵列的最快方法是什么?

Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
Run Code Online (Sandbox Code Playgroud)

(我已经知道,随着项目的动态列表工作时,你应该宁可使用List,ArrayList或类似的IEnumerables.但是,如果你坚持使用阵列的遗留代码做什么?)

到目前为止我尝试过的:

' A) converting to List, add item and convert back
Dim list As List(Of Integer)(arr)
list.Add(newItem)
arr = list.ToArray()
' --> duration for adding 100.000 items: 33270 msec

' B) redim array and add item
ReDim Preserve arr(arr.Length)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 9237 msec

' C) using Array.Resize
Array.Resize(arr, …
Run Code Online (Sandbox Code Playgroud)

vb.net arrays dynamic-arrays

23
推荐指数
4
解决办法
17万
查看次数

制作一个接受C中任何类型的动态数组

我试图找到一种方法来构建一个结构来保存一个可以处理任何数据类型的动态数组(包括用户定义的数据类型),到目前为止,这就是我想出的.

#define Vector(DATATYPE) struct {   DATATYPE* data; size_t size; size_t used; }

typedef Vector(int) int_Vector;

int main(int argc, char* argv[]){
    int_Vector vec;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这很有效但我很想知道,这是一个好习惯吗?我应该做这样的事情还是有更好的方法?还有一种方法可以实现这个typedef Vector(int) int_vector部分.基本上这种方式可以让我使用数组,就像c ++使用模板一样,它看起来像这样:

#define Vector(DATATYPE) struct {   DATATYPE* data; size_t size; size_t used; }

int main(int argc, char* argv[]){
    Vector(int) vec;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

主要是为了避免这么多的typedef并将它们全部放在一个名字下面.

c dynamic-arrays

19
推荐指数
3
解决办法
3005
查看次数

如何在C++中获取动态数组的大小

通过输入大小并将其存储到"n"变量中的动态数组代码,但我想从模板方法获取数组长度而不使用"n".

int* a = NULL;   // Pointer to int, initialize to nothing.
int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-arrays

17
推荐指数
1
解决办法
6万
查看次数

为什么两个TBy不能使用重叠数据?

请考虑以下XE6代码.目的是ThingData应该将两个Thing1&写入控制台Thing2,但事实并非如此.这是为什么?

program BytesFiddle;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TThing = class
  private
    FBuf : TBytes;
    FData : TBytes;
    function GetThingData: TBytes;
    function GetThingType: Byte;
  public
    property ThingType : Byte read GetThingType;
    property ThingData : TBytes read GetThingData;

    constructor CreateThing(const AThingType : Byte; const AThingData: TBytes);
  end;

{ TThing1 }

constructor TThing.CreateThing(const AThingType : Byte; const AThingData: TBytes);
begin
  SetLength(FBuf, Length(AThingData) + 1);
  FBuf[0] := AThingType;
  Move(AThingData[0], FBuf[1], Length(AThingData));

  FData := @FBuf[1];
  SetLength(FData, …
Run Code Online (Sandbox Code Playgroud)

delphi dynamic-arrays

17
推荐指数
3
解决办法
1945
查看次数

动态数组是否超出范围时会自动解除分配?

在这个例子中

procedure foobar;
var tab:array of integer;
begin
  setlength(tab,10);
end;
Run Code Online (Sandbox Code Playgroud)

是阵列被破坏还是内存泄漏?

delphi memory-leaks reference-counting dynamic-arrays

16
推荐指数
1
解决办法
1万
查看次数