如果我有一个大小为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.
}
}
答案 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是一种糟糕的模式。