我想循环遍历一个最大值为1000的数组。我使用文本文件中的值填充数组。我试图循环遍历该数组,但在我的for循环中,我不知道数组的长度,所以我不知道在for循环语句的第二部分放什么。例如:我有一个名为int scores[1000];
的数组,我试图遍历此数组并将分数放入成绩类别。所以A = 90-100,B = 80-89,C = 70-79,D = 60-69,F = 0-59。
所以我不知道我的for循环会是什么样子:
for(int i = 0; i < ...; i++){
if(scores[i] > = 90 || scores[i] <= 100){
//Do stuff...
}
我想我也很困惑如何在最后获得每个类别的总计数。但在大多数情况下,它如何迭代这个数组。我知道sizeof(scores [])不会工作,因为这会给我int大小而不是数组本身的长度。提前谢谢!
答案 0 :(得分:6)
如果您使用std::vector
(link),则可以添加元素并让矢量动态更改大小。可以使用size()
方法轻松查询该大小。如果你使用这样的数组,你必须自己跟踪它中的元素数量。
如果你有一个带有元素的向量文件,你的循环可能如下所示:
std::vector<int> scores;
// fill vector
for (unsigned int i=0; i<scores.size(); i++) {
// use value
}
如果你必须使用数组,并且实际上有一个scoreCount
变量,其中包含了实数值,只需在你的循环中使用它:
for (int i=0; i<scoreCount; i++) {
// use value
}
正如我在评论中提到的,第三个选项是使用您从未使用的值(通常为-1)初始化整个数组,然后将其用作填充与空数组位置的标记,如下所示:
for (int i=0; i<1000; i++) {
scores[i] = -1;
}
// add real values to scores
int i=0;
while (scores[i] != -1 && i < 1000) {
// use value
i++;
}
答案 1 :(得分:6)
实际上sizeof()
应该这样做:
sizeof(scores) / sizeof(scores[0])
这将为您提供数组的总元素数。
答案 2 :(得分:2)
填充scores
数组时,您需要实际计算放入其中的项目数。然后你记住那个数字,然后用它进行迭代。例如,您可能已经读过这样的分数:
// Read some scores: Stop when -1 is entered, an error occurs, or 1000 values are read.
int num_scores = 0;
for( ; num_scores < 1000; num_scores++ )
{
if( !(cin >> scores[num_scores]) || scores[num_scores] == -1 ) break;
}
// Do stuff with scores...
for(int i = 0; i < num_scores; i++) {
...
}
还有其他一些选择需要考虑:
std::vector
代替。顺便说一句,循环中的逻辑语句将始终为true。您确定不想使用&&
代替||
吗?
答案 3 :(得分:2)
如果您真的想要使用固定大小的容器,请使用std::array
代替现代C ++而不是C数组:
#include <array>
std::array<std::int32_t, 1000> scores;
for (std::size_t i{0}; i < scores.size(); ++i) {
// Do stuff...
}
否则使用std::vector
:
#include <vector>
std::vector<std::int32_t> scores;
for (std::size_t i{0}; i < scores.size(); ++i) {
// Do stuff...
}
如果您能够使用C ++ 11,我还建议使用固定宽度整数类型。