如何在动态数组上使用搜索功能?

时间:2018-10-29 18:57:50

标签: c++ arrays multidimensional-array dynamic

我试图在我创建的动态数组上使用线性搜索功能,但随后我的计算机科学课的助教告诉我们,大多数搜索功能都使用const数组。

有什么办法可以编辑我的动态数组以使其变得持久?或者也可以使搜索函数使用动态数组(并且不会产生错误?)。 我将简要介绍我的代码:

我使用从文件中读取的行动态创建一个数组,然后将每一行动态分配给一个列数组。

char ** domain[] = new char * [rows];

for(int i = 0; i < rows; i++)
{
    *domain = new char[columns];  
    domain++;  
}

我们教过的搜索功能类型是:``

char searchArray( const char list[], char letter, int maxSize)
{
    >code goes here  
}

还有其他使用动态多维数组的搜索功能的方法吗?

为回应评论,我不能使用向量。这是我们使用常规数组的任务。我还没有被教过如何使用向量。

1 个答案:

答案 0 :(得分:2)

在线

char ** domain[] = new char * [rows];

char ** domain[]尝试制作char **的数组。如果编译器没有抱怨[]中没有有效的数组大小,那么您将拥有3D结构。您只需要普通的char **用于2D结构,所以

char ** domain = new char * [rows];

填充内部尺寸的循环是正确的,只是它无法跟踪domain的起点

for(int i = 0; i < rows; i++)
{
    *domain = new char[columns];  
    domain++;  
} 

应该是

char ** temp = domain;

for(int i = 0; i < rows; i++)
{
    *temp = new char[columns];
    temp++;
}

为了保留起点,但在这种情况下,数组符号可能是更聪明,更易于阅读的选项。

for(int i = 0; i < rows; i++)
{
    domain[i] = new char[columns];
}

转到searchArray。它需要知道它有两个尺寸(const char **),并且有两个最大尺寸(maxRowmaxColumn)。看起来像

char searchArray(const char ** list, 
                 char letter, 
                 int maxRow, 
                 int maxColumn)
{
    >code goes here  
}

代码在这里是您的问题,但是可能是两个嵌套的for循环,迭代到maxRowmaxColumn并在找到letter时返回。

但是...为什么返回char?返回数组中的位置更加有用。我们可以使用std::pair,但是如果std::vector超出限制,那么pair也可能会使用。请考虑以下内容:

struct coord
{
    int row;
    int column;
};

coord searchArray(const char ** list, 
                  char letter, 
                  int maxRow, 
                  int maxColumn)
{
    coord location;
    >code goes here
    return location;
}

如果找不到该项目,请将rowcolumn设置为不可能变为-1的值,以便您可以轻松地测试未发现的情况。

请停止在此处,除非您想用老师的大脑<删除被删除>。

上面没有建立2D数组。您无法在C ++中获得动态分配的2D数组。您拥有的是一个数组数组。这样做有一些弊端,看看将它们缝合在一起的所有工作,当事情成直线时,计算机会喜欢它。数组不是。每个不同的分配都可能在内存中完全不同的某个地方,迫使程序跳来跳去,等待并加载不同的内存块。有时,该程序将花费更多的时间来等待发现和加载东西,而不是花在进行实际工作上。 This sucks.

解决方案是制作一个1D数组并使它看起来像2D数组。 Here's an example of that from the C++ FAQ

通过遵循此示例,您将学到很多精巧的东西,其中最重要的是RAIIRule of Three,这两个概念没有它们,您将无法编写非平凡的高质量C ++代码