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)在C99这是合法的:
void f(size_t sz) {
char arr[sz];
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.
AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?
我能想到的就是:
delete [])和慢堆分配.为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.
而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).
编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".
我开始在学校最后一年开始之前检查数据结构和算法,以确保我掌握一切.一个评论问题说"使用链表或动态数组实现堆栈并解释为什么你做出了最好的选择".
对我来说,使用带有尾指针的列表来实现堆栈似乎更直观,因为它可能需要经常调整大小.对于大量数据来说,列表是更好的选择,因为动态数组重新调整大小是一项昂贵的操作.此外,使用列表,您不需要分配比实际需要更多的空间,因此它更节省空间.
但是,动态数组肯定允许更快地添加数据(除非需要调整大小).但是,我不确定使用数组是否整体更快,或者只是不需要调整大小.
该书的解决方案说"存储非常大的对象,列表是一个更好的实现",但我不明白为什么.
哪种方式最好?应该使用哪些因素来确定哪种实施方式"最佳"?还有,我的逻辑是什么?
performance stack linked-list dynamic-arrays data-structures
这个网站上的第一个计时器,所以这里..
我是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) 有一个基于范围的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*&)'
如何在动态数组中使用这种新语法?
将新项目添加到现有阵列的最快方法是什么?
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) 我试图找到一种方法来构建一个结构来保存一个可以处理任何数据类型的动态数组(包括用户定义的数据类型),到目前为止,这就是我想出的.
#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并将它们全部放在一个名字下面.
通过输入大小并将其存储到"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) 请考虑以下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) 在这个例子中
procedure foobar;
var tab:array of integer;
begin
setlength(tab,10);
end;
Run Code Online (Sandbox Code Playgroud)
是阵列被破坏还是内存泄漏?
dynamic-arrays ×10
c++ ×5
arrays ×3
delphi ×2
pointers ×2
stack ×2
c ×1
c++11 ×1
foreach ×1
linked-list ×1
memory-leaks ×1
performance ×1
standards ×1
vb.net ×1