C ++如何迭代直到动态数组结束?

时间:2008-12-18 15:37:53

标签: c++ arrays

假设我声明了一个像

这样的动态数组
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++;
         }

我认为如果要存储的两个数字之间有一个很大的空白区域(显然不是),那么阵列辅助将最终被废弃。我想知道是否有一种方法可以迭代到这种类型的数组中的未定义结束。谢谢你的答案。

11 个答案:

答案 0 :(得分:15)

你没有:将数组包装成一个记住其长度的结构:std::vector

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

答案 1 :(得分:5)

没有便携式的方法。将大小与数组一起传递,或者更好地使用标准容器,例如std::vector

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您的代码需要跟踪数组,因此大小永远不会是未知的。 (或者你必须使用一些带有代码的库来实现这一点。)

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

答案 4 :(得分:1)

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

如果你期望你的stirng就像一个c-string(又名不包含NULL),那么使用line.c_str()而不是line.data()。这将保证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
}

答案 5 :(得分:1)

  

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

什么?那个蠢人的想法是什么?

std :: vector不是“STL”(惠普的受版权保护的产品)的一部分,但是(已经有将近十年)是C ++语言标准的一部分

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

您可以创建一个只有您需要的方法的简单Vector类。我实际上必须为今年参加的课程重新创建Vector类,这并不是很困难。

答案 9 :(得分:0)

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

是的,我在约会。

答案 10 :(得分:0)

这就像家庭作业一样,教师的目标是让你感受到实现动态数组所需要的东西。到目前为止,你正在获得一个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,以及更多。