索引为空时如何停止循环遍历数组?

时间:2014-05-03 19:40:52

标签: c++ arrays break

如果我有一个大小为MAX_SIZE的数组并且只占用了20个索引,那么如何使它在itemList[20]之后停止打印0? (我正在阅读文本文件)

const int MAX_SIZE = 1000;
item itemList[MAX_SIZE];

for(int i= 0; i<MAX_SIZE;i++)
{
itemList[i].Print(); //prints members in item

  if(i==19) // I used this just to see what I was printing properly
   {         //I know it is bad practice so I would like an alternative.
       break; //Also, it is only possible if you have access to the text file.
   }
}

5 个答案:

答案 0 :(得分:4)

您可以执行基本检查:

if(itemList[i].Function() == 0) break;

答案 1 :(得分:3)

作为break的替代方案,您可以使用while循环:

int i = 0;
while (itemList[i] != 0 && i < MAX_SIZE)
{
    itemList[i].Print();
    i++;
}

itemList[i] != 0替换为您用来确定元素是否被占用的表达式。

或者,跟踪从文件构建数组时有多少元素,并且只循环多次。

更好的是,请记住,您正在使用C ++,而不是C.将文件中的元素添加到容器(如std::vector而不是原始数组),然后循环遍历整个事物。这也解决了代码中的严重错误;也就是说,当文件中有超过1000个条目时,您将具有未定义的行为。

答案 2 :(得分:0)

const int MAX_SIZE = 1000;
item itemList[MAX_SIZE];

for (int i = 0; i < sizeof(aitemList / sizeof(*itemList)); i++)
{
    if (itemList[i] != 0)
        itemList[i].Print();
}

或使用矢量

std::vector<int> itemList;

for (int i = 0; i < itemList.size(); i++) 
{
    if (itemList[i] != 0)
    {
        // do stuff
    }
}

答案 3 :(得分:-1)

简短的课程:

  • 正确迭代空终止指针数组
  • 以异常安全的方式清理指针数组
  • 正确解决您的问题

#include <iostream>
#include <algorithm>
#include <memory>

using namespace std;

struct Oper {
    void exec() const { cout << "Hello\n"; }
    ~Oper() { cout << "deleted\n"; }
};


int main()
{
    Oper* myArray[1000];
    fill(begin(myArray), end(myArray), nullptr);

    // make a sentinel to ensure that the array is cleaned up if there is an exception
    std::shared_ptr<void> sentinel(&myArray, [&](void*) {
        // clean up array
        for (auto p = begin(myArray) ; p != end(myArray) ; ++p) {
            delete *p;
        }
    });

    myArray[0] = new Oper;
    myArray[1] = new Oper;
    myArray[2] = new Oper;
    myArray[4] = new Oper; // note: missed 3

    for(auto p = begin(myArray) ; p != end(myArray) && *p ; ++p) {
        (*p)->exec();
    }

   return 0;
}

输出:

Compiling the source code....
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1

Executing the program....
$demo 
Hello
Hello
Hello
deleted
deleted
deleted
deleted

答案 4 :(得分:-4)

for(int i= 0; i<MAX_SIZE && i<20;i++)

它看起来更好,因为使用break是一种糟糕的模式。