标签: dynamic-arrays

C动态增长阵列

我有一个程序读取游戏中实体的"原始"列表,我打算创建一个数组,其中包含一个不确定数量的实体的索引号(int),用于处理各种事物.我想避免使用太多的内存或CPU来保存这些索引......

到目前为止,我使用的一个快速而肮脏的解决方案是在主处理函数(本地焦点)中声明具有最大游戏实体大小的数组,以及另一个整数来跟踪已添加到列表中的数量.这并不令人满意,因为每个列表都拥有3000多个阵列,这并不是那么多,但感觉就像是浪费,因为我可以使用6-7列表的解决方案来实现不同的功能.

我没有找到任何C(不是C++或C#)特定的解决方案来实现这一目标.我可以使用指针,但我有点害怕使用它们(除非它是唯一可能的方式).

数组不会离开本地函数作用域(它们将被传递给函数,然后被丢弃),以防更改内容.

如果指针是唯一的解决方案,我如何跟踪它们以避免泄漏?

c dynamic-arrays

120
推荐指数
4
解决办法
20万
查看次数

如何在python中获得任何大小的空数组?

我基本上想在C中使用python等效的py:

int a[x];
Run Code Online (Sandbox Code Playgroud)

但是在python中我声明了一个数组:

a = []
Run Code Online (Sandbox Code Playgroud)

问题是我想为随机插槽分配如下值:

a[4] = 1
Run Code Online (Sandbox Code Playgroud)

但我无法用python做到这一点,因为数组是空的.

python arrays dynamic-arrays

102
推荐指数
5
解决办法
40万
查看次数

如何动态地将项添加到Java数组?

在PHP中,您可以通过以下方式动态向元数添加元素:

$x = new Array();
$x[] = 1;
$x[] = 2;
Run Code Online (Sandbox Code Playgroud)

在此之后,$x将是这样的数组:{1,2}.

有没有办法在Java中做类似的事情?

java arrays dynamic-arrays

80
推荐指数
6
解决办法
35万
查看次数

动态分配的阵列的理想增长率是多少?

C++有std :: vector,Java有ArrayList,许多其他语言都有自己的动态分配数组.当动态数组空间不足时,它会重新分配到更大的区域,旧值将被复制到新数组中.这种阵列性能的核心问题是阵列的大小增长速度.如果你总是只能变得足够大以适应当前的推动,那么你每次都会重新分配.因此,将数组大小加倍,或将其乘以1.5倍是有意义的.

有理想的生长因子吗?2倍?1.5倍?理想上,我的意思是数学上合理,最佳平衡性能和浪费的记忆.理论上,我认识到,鉴于您的应用程序可能具有任何可能的推送分布,这在某种程度上取决于应用程序.但我很想知道是否有一个"通常"最好的值,或者在一些严格的约束条件下被认为是最好的.

我听说有一篇关于这个的文章,但我一直都找不到.

arrays math vector arraylist dynamic-arrays

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

C++的NumPy样式数组?

是否有任何C++(或C)库具有类似NumPy的数组,支持切片,矢量化操作,逐元素添加和减去内容等?

c++ arrays dynamic-arrays

62
推荐指数
5
解决办法
4万
查看次数

C++没有告诉你动态数组的大小.但为什么?

我知道在C++中无法获得动态创建的数组的大小,例如:

int* a;
a = new int[n];
Run Code Online (Sandbox Code Playgroud)

我想知道的是:为什么?人们是否在C++规范中忘记了这一点,还是有技术原因?

信息不是存储在某个地方吗?毕竟,命令

delete[] a;
Run Code Online (Sandbox Code Playgroud)

似乎知道它必须释放多少内存,所以在我看来,delete[]有一些方法可以知道它的大小a.

c++ dynamic-arrays

61
推荐指数
3
解决办法
5408
查看次数

正确分配多维数组

这个问题的目的是提供一个关于如何在C中动态正确分配多维数组的参考.这是一个经常被误解的主题,即使在一些C编程书籍中也很难解释.因此,即使是经验丰富的C程序员也很难做到正确.


我从编程教师/书籍/教程中了解到,动态分配多维数组的正确方法是使用指针指针.

然而,SO上的几个高代表用户现在告诉我这是错误和不好的做法.他们说指针到指针不是数组,我实际上并没有分配数组,而且我的代码不必要地慢.

这就是我教我分配多维数组的方法:

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

int** arr_alloc (size_t x, size_t y)
{
  int** pp = malloc(sizeof(*pp) * x);
  assert(pp != NULL);
  for(size_t i=0; i<x; i++)
  {
    pp[i] = malloc(sizeof(**pp) * y);
    assert(pp[i] != NULL);
  }

  return pp;
}

int** arr_fill (int** pp, size_t x, size_t y)
{
  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      pp[i][j] = (int)j + 1;
    }
  }

  return pp;
}

void arr_print (int** pp, size_t x, size_t y) …
Run Code Online (Sandbox Code Playgroud)

c arrays dynamic-arrays dynamic-allocation variable-length-array

51
推荐指数
1
解决办法
4882
查看次数

为什么在C++ 14中运行时大小的数组和std :: dynarray?

草案C++ 14包括运行时大小的数组和std::dynarray容器.从我所知道的,两者之间的唯一真正的区别在于std::dynarray有一个STL接口(例如begin,end,size,等),同时运行时大小的数组没有.那么为什么C++ 14需要它们呢?

我知道运行时大小的数组是核心语言的std::dynarray一部分,同时也是标准库的一部分,但是该提议std::dynarray清楚地表明作者希望编译器在许多情况下能够提供特殊支持,std::dynarray以便它可以高效尽可能地,即,与运行时大小的数组一样高效.因此,语言/库的区别似乎有点人为.

那么,为什么C++ 14需要两个运行时大小的数组std::dynarray呢?并且鉴于它std::dynarray具有更丰富的(STLified)接口,为什么不只是删除运行时大小的数组,假设std::dynarray可以以相同的运行时效率实现?

澄清

当我谈到"运行时大小的数组"时,我指的是N3639中描述的新的C++ 14核心语言特性,而不是传统的C数组或VLA或C++ 11中的任何内容.

c++ dynamic-arrays dynarray c++14

45
推荐指数
1
解决办法
9734
查看次数

为什么通过基指针删除[]一组派生对象是未定义的行为?

我在C++ 03标准中找到了以下片段5.3.5 [expr.delete] p3:

在第一个备选(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或者行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义.


快速回顾静态和动态类型:

struct B{ virtual ~B(){} };
struct D : B{};

B* p = new D();
Run Code Online (Sandbox Code Playgroud)

静态类型pB*,而动态类型*pD,1.3.7 [defns.dynamic.type]:

[ 例如:如果一个p静态类型为"指向"的指针class B指向一个对象class D,B该表达式的动态类型*p是" D."]


现在,再次查看顶部的引用,这意味着如果我正确的话,下面的代码会调用未定义的行为,无论是否存在virtual析构函数:

struct B{ virtual ~B(){} };
struct D : B{};

B* p = new D[20];
delete [] p; // undefined behaviour here …
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior dynamic-arrays delete-operator

36
推荐指数
2
解决办法
6448
查看次数

如果在运行时间之前我不知道长度,我该如何声明一个数组?

我最初有一个数组[1..1000]被定义为全局变量.但是现在我需要那个是n,而不是1000,直到后来才发现n.我知道在填充数组之前n是什么,但我需要它是全局的,因此需要一种方法来在运行时定义全局数组的大小.

Context使用文件中字节的线性转换填充数组.我不知道文件有多大,直到有人想要打开它并且文件可以是任何大小.

arrays delphi global-variables redefine dynamic-arrays

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