【问题标题】:How can I use a search function on a dynamic array?如何在动态数组上使用搜索功能?
【发布时间】:2019-04-02 18:35:33
【问题描述】:

我试图在我创建的动态数组上使用线性搜索函数,但后来我的计算机科学课的助教告诉我们,大多数搜索函数都使用 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  
}

有没有其他使用动态多维数组的搜索函数的方法?

针对 cme​​ts,我不能使用向量。这是我们使用普通数组的任务。我还没有学会如何使用向量。

【问题讨论】:

  • 为什么不使用std::vector&lt;string&gt;std::find()char ** domain[] = new string * [rows]; 顺便说一句不起作用。
  • @πάνταῥεῖ 就像我之前说的那样,我还没有学过所有那些复杂的东西,我在 Cs 1337 中。我的课程不涉及向量
  • 这不是复杂的东西,只是 C++ 的基础。
  • @πάνταῥεῖ 好吧,你曾经处于我的水平,并不是每个人都开始 c++ 无所不知,这就是我在这里的原因。另外我还不知道向量。我更喜欢正常的方法
  • @KelvinOjiako C++ 中的正常方法 是使用std::vector 而不是原始数组。

标签: c++ arrays multidimensional-array dynamic


【解决方案1】:

排队

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,以便您可以轻松测试未找到的情况。

到此为止,除非你想用你老师的大脑

上面没有构建二维数组。您无法在 C++ 中获得动态分配的二维数组。你所拥有的是一个数组数组。这样做有几个缺点,看看所有将它们拼接在一起的工作,当事情直线发展时,计算机会喜欢它。数组数组没有。每个不同的分配都可能在内存中完全不同的地方迫使程序跳来跳去,等待并加载不同的内存块。有时,程序会花更多的时间坐在那里等待找到和加载东西,而不是花在实际工作上。 This sucks.

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

您将从这个示例中学到很多精巧的东西,其中最重要的是 RAIIRule of Three,如果没有这两个概念,您将无法编写重要的高质量 C++ 代码。

【讨论】:

  • 非常感谢,您几乎解决了我的心情。我有一个简单的问题,你不会让动态数组保持不变会影响指针并阻止它沿着数组移动吗?因为常量不能改变,这是否也意味着我不会可以四处走动吗?
  • @KelvinOjiako const 相对于类型的位置,*s 改变了常量。对此的讨论应该解释:What is the difference between const int*, const int * const, and int const *?。花时间了解顺时针/螺旋规则。随着时间的推移,它可以为您节省很多麻烦。在这种情况下,指向的数据是常量,而不是指向它的指针。
  • 讨厌冒险再次破坏你的心情,但 C++ 是一种极其复杂的语言。世界上可能有几百人没有有很长的路要走。我不是其中之一。如果你完成了你的课程,但你仍然认为你知道的不多,不要感到羞耻。一堂课真的没有足够的时间。
  • 是的,我完全同意你的观点,但重要的是我有点喜欢它。不,你的好大声笑,只是一些特定的东西触发了我
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多