【问题标题】:C++ How can I iterate till the end of a dynamic array?C ++如何迭代直到动态数组的末尾?
【发布时间】:2010-09-27 13:14:24
【问题描述】:

假设我声明了一个动态数组

int *dynArray = new int [1];

在某个时刻用未知数量的 int 值初始化。

我将如何迭代到未知大小的数组的末尾?

另外,如果它读取一个空格,它在数组中的对应位置是否会被丢弃?

从下面的用户帖子中复制输入:

事情是:

a) 我不允许使用 STL(意思是:不)

b) 我想将一个字符串分解成它的字符并存储它们。到目前为止,我想使用这样的函数:

 string breakLine (string line){


         int lineSize = line.size();

         const char *aux;

         aux=line.data();

         int index=0;


         while (index<=lineSize){
         mySynonyms[index]=aux[index]; 

         index++;
         }

我认为如果要存储的两个数字之间有很大的空格(显然不是),那么数组 aux 最终会被丢弃。我想知道是否有办法在这种类型的数组中迭代到未定义的结尾。谢谢你的回答。

【问题讨论】:

  • 你的示例数组的大小是已知的,它是 1 个整数。
  • 除非您在其他地方分配一个新数组并分配给 dynArray。该数组的大小为 1。
  • 您所说的“大空白”是什么意思,您指的是什么“两个数字”?

标签: c++ arrays


【解决方案1】:

这闻起来像家庭作业,老师的目标是让您了解实现动态数组需要什么。到目前为止,你得到了一个 F。

你需要意识到当你像这样分配内存时

int *dynArray = new int [1];

你只分配了一个整数,而不是通过某种未知的魔法来扩展无限数量的整数。最重要的是,你只能说

dynArray[0] = 78;

但你不能说

dynArray[1] = 8973;

索引 1 处的元素不存在,您正在进入不是为您保留的内存。当您释放数组时,此特定违规将导致稍后崩溃,因为您存储 8973 的内存属于堆管理数据结构,并且您损坏了堆。

正如许多其他响应者所提到的,您必须始终知道数组中有多少元素。因此,您必须按照以下方式做一些事情

int arraySize = 1;
int *dynArray = new int [arraySize];

arraySize 与数组一起使用,最好在一个 C++ 对象中与 dynArray 结合使用。

现在,在分配给 dynarray[1] 之前,您必须重新分配数组:

if (index > arraySize) {
  int newSize = index+1;
  int *newArray = new int[newSize]
  // don't forget to copy the data from old array to new
  memcpy(newarray dynArray, sizeof *newArray * arraySize);
  arraySize = newSize;
  dynArray = newArray;      
}
// now you're ready!
dynArray[index] = value;

现在,如果你想让它更有效率,你分配的比你需要的多,所以你不必每次添加元素时都分配。我将把这个作为练习留给读者。

在完成所有这些之后,你可以提交你的作业,你会欣赏为你完成所有这些工作的不起眼的 std::vector 以及更多。

【讨论】:

    【解决方案2】:

    如果不允许您使用 STL(无论出于何种原因),您要做的第一件事就是实现您自己的版本 - 至少是您需要的部分,以及您需要的可定制性级别.例如,使用自定义allocator 使您自己的vector 类参数化可能有点过头了。但尽管如此实现你自己的轻量级vector。其他一切都会导致糟糕的、难以维护的解决方案。

    【讨论】:

      【解决方案3】:

      a) 我不允许使用 STL(意味着: 没有)

      什么?那是谁的愚蠢想法?

      std::vector 不是“STL”(HP 的版权产品)的一部分,而是(并且已经存在近十年)C++ 语言标准的一部分 .

      【讨论】:

      • 对于某些软件认证,不允许使用 STL。
      【解决方案4】:

      您在下面的帖子中解释说您想查看 std::string 的内容。

      如果您希望您的搅拌器像一个 c 字符串(也就是不包含 NULL),那么请使用 line.c_str() 而不是 line.data()。这将保证 aux 指向一个 null 终止 c 样式的字符串。

      之后您可以迭代直到 aux[index] == '\0';

      否则,您可以使用 line.data() 和 string.length/size 来获取它的大小,就像在您的示例中一样。

      然而,“将字符串分解为字符”是毫无意义的,字符串一个字符数组。只需复制字符串并将其存储即可。你可以这样做:

      char ch = line[index];
      

      更好的是,在原始字符串上使用迭代器!

      for(std::string::const_iterator it = line.begin(); it != line.end(); ++it) {
          const char ch = *it;
          // do whatever with ch
      }
      

      【讨论】:

      • 除了 std::strings 可以合法地包含 '\0' 字符。只需使用迭代器或调用 string::length() 并按索引进行迭代。
      • 确实,我会改写我的答案
      【解决方案5】:

      如果存在无效值,您可以将其用作哨兵,并确保您的所有数组都以此终止。当然,它很容易出错,并且当您碰巧错过一次时会导致难以发现的错误,但这就是我们在 FORTRAN 中读取文件时经常做的事情(回到全大写时代,在 END= 之前)成为标准)。

      是的,我正在和自己约会。

      【讨论】:

        【解决方案6】:

        您可以创建一个仅包含您需要的方法的简单 Vector 类。我实际上不得不为我今年学习的一个类重新创建 Vector 类,这不是很困难。

        【讨论】:

        • 坏主意。使用 std::vector,已知它是正确的。要获得正确和异常安全,比您想象的要难。
        【解决方案7】:

        使用向量,它有一个返回整数的vector.size()函数和一个返回迭代器的vector.end()函数。

        【讨论】:

          【解决方案8】:

          简短的回答是你不能。如果你有一个指向数组第一个元素的指针,你就无法知道数组的大小。为什么要首先使用数组。如果您的数组可以动态更改大小,则使用 std::vector 会好得多,如果它是固定大小,则使用 boost::Array 会更好。

          我不明白你的第二个问题。

          【讨论】:

            【解决方案9】:

            您的代码需要跟踪数组,因此大小永远不会未知。 (或者您必须使用一些库来执行此操作。)

            我不明白你问题的最后一部分。能详细点吗?

            【讨论】:

              【解决方案10】:

              您不会:将数组包装成一个可以记住其长度的结构:std::vector

              std::vector v(1);
              std::for_each( v.begin(), v.end(), ... );
              

              【讨论】:

                【解决方案11】:

                没有可移植的方式来做到这一点。要么将大小与数组一起传递,要么更好地使用标准容器,例如std::vector

                【讨论】:

                  猜你喜欢
                  • 2018-01-09
                  • 1970-01-01
                  • 2010-12-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-10-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多