为动态变化的多维数组重新分配 space?
Reallocating space for a dynamically changing multi-dimensional array?
我只是想知道我到底会怎么做。我知道我应该使用 malloc
,但我仍然不确定该怎么做。
编辑:我意识到我实际想要使用的功能是realloc
我要分配的每一行的大小都会发生变化,而且我还想随着程序代码的进行添加更多的行。
如果你想知道为什么,我正在做一个项目,在这个项目中,我读取了一个 .txt
文件,然后打印出出现次数最多的单词,以及出场次数。
对于你想要读取行文件的情况,我建议你使用 linked 行列表而不是行数组,因为你可以轻松地附加到 link 通过保留指向最后一个元素的指针来编辑列表(自行解决)。如果愿意,您可以稍后将该 linked 列表转换为数组。
您还可以尝试计算出文件的长度,并一次性为整个文件分配所有 space(然后可能一次读入整个文件),这样您不必一直重新分配。同样,您自己制定详细信息。
对于您的特定问题,您实际上根本不需要将文件读入内存!您可以将单词连同出现次数一起保存在 trie 或类似的数据结构中,并将 link 保存到迄今为止计数最高的单词。它并不复杂,但细节超出了这个问题的范围。
根据您程序的动态行为,我有几个想法给您。
首先,您可以考虑链表而不是数组。这将使删除和添加元素变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后是行元素本身。
使用链表的二维矩阵:
[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
其次,如果您通常只 ADD 个元素,您的行的行为可能与 C++ 向量相似。使用内部变量创建每个 line/row 以跟踪填充级别。如果结构已满,则重新分配更大的大小(有消息称 "double the size" 是一种很好的通用方法)。
可以用来代替链表的数据结构(至少在一行内):
struct d_array(){
int fillevel, size;
void* memory;
}
这个数据结构需要一些函数来在每次插入之前检查它是否已满并根据需要重新分配。缩小比较困难,您可以尝试 运行 定期清理。通常,您不想急于收缩,因为以后可能会再次需要 space(如果您的行再次增长)。
In case you're wondering why, I'm working on a project in which, I
read a .txt file and then print out, the word with the highest number
of appearances, as as well as the number of appearances.
为此您不需要多维数组。文本按顺序存储,新行使用 \n
字符表示。
但是您还需要一些关联容器,例如地图,以便在解析文本文件时在其中存储唯一的单词。
在"pseudo code"中:
for the entire text
parse a word
if word is not in the map insert it with count one
else find and increment the word's count
find the word with higher count value
不幸的是,C 没有自带映射容器,您将不得不 find one 或自己编写一个,这可能仍然超出您的编程能力。
至于单词的解析,您可以创建一个字符数组来表示有效的文本字符,例如 AaBbCcDd...
并为文本的每个字符检查它是否包含在该数组中。如果它包含而前一个不包含(或者这是第一个字符),则在单词开始的地方注册一个索引,如果它不包含,并且之前有一个,那么您标记单词的结尾,从索引范围中提取单词并继续在地图中更新它。以此类推,直到您到达文本的末尾。
最后但同样重要的是,地图实际上是可选的。您也可以将单词条目作为 char * word
和 int count
的结构存储在常规数组中,但是在很多单词的情况下,查找性能可能会很差,因为它会涉及很多字符串比较,而映射将散列字符串并查找整数而不是字符串。
我只是想知道我到底会怎么做。我知道我应该使用 malloc
,但我仍然不确定该怎么做。
编辑:我意识到我实际想要使用的功能是realloc
我要分配的每一行的大小都会发生变化,而且我还想随着程序代码的进行添加更多的行。
如果你想知道为什么,我正在做一个项目,在这个项目中,我读取了一个 .txt
文件,然后打印出出现次数最多的单词,以及出场次数。
对于你想要读取行文件的情况,我建议你使用 linked 行列表而不是行数组,因为你可以轻松地附加到 link 通过保留指向最后一个元素的指针来编辑列表(自行解决)。如果愿意,您可以稍后将该 linked 列表转换为数组。
您还可以尝试计算出文件的长度,并一次性为整个文件分配所有 space(然后可能一次读入整个文件),这样您不必一直重新分配。同样,您自己制定详细信息。
对于您的特定问题,您实际上根本不需要将文件读入内存!您可以将单词连同出现次数一起保存在 trie 或类似的数据结构中,并将 link 保存到迄今为止计数最高的单词。它并不复杂,但细节超出了这个问题的范围。
根据您程序的动态行为,我有几个想法给您。
首先,您可以考虑链表而不是数组。这将使删除和添加元素变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后是行元素本身。
使用链表的二维矩阵:
[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
其次,如果您通常只 ADD 个元素,您的行的行为可能与 C++ 向量相似。使用内部变量创建每个 line/row 以跟踪填充级别。如果结构已满,则重新分配更大的大小(有消息称 "double the size" 是一种很好的通用方法)。
可以用来代替链表的数据结构(至少在一行内):
struct d_array(){
int fillevel, size;
void* memory;
}
这个数据结构需要一些函数来在每次插入之前检查它是否已满并根据需要重新分配。缩小比较困难,您可以尝试 运行 定期清理。通常,您不想急于收缩,因为以后可能会再次需要 space(如果您的行再次增长)。
In case you're wondering why, I'm working on a project in which, I read a .txt file and then print out, the word with the highest number of appearances, as as well as the number of appearances.
为此您不需要多维数组。文本按顺序存储,新行使用 \n
字符表示。
但是您还需要一些关联容器,例如地图,以便在解析文本文件时在其中存储唯一的单词。
在"pseudo code"中:
for the entire text
parse a word
if word is not in the map insert it with count one
else find and increment the word's count
find the word with higher count value
不幸的是,C 没有自带映射容器,您将不得不 find one 或自己编写一个,这可能仍然超出您的编程能力。
至于单词的解析,您可以创建一个字符数组来表示有效的文本字符,例如 AaBbCcDd...
并为文本的每个字符检查它是否包含在该数组中。如果它包含而前一个不包含(或者这是第一个字符),则在单词开始的地方注册一个索引,如果它不包含,并且之前有一个,那么您标记单词的结尾,从索引范围中提取单词并继续在地图中更新它。以此类推,直到您到达文本的末尾。
最后但同样重要的是,地图实际上是可选的。您也可以将单词条目作为 char * word
和 int count
的结构存储在常规数组中,但是在很多单词的情况下,查找性能可能会很差,因为它会涉及很多字符串比较,而映射将散列字符串并查找整数而不是字符串。