【问题标题】:loop through an array in c++循环遍历 C++ 中的数组
【发布时间】:2013-05-15 15:26:57
【问题描述】:

我想遍历一个最大值为 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 大小而不是数组本身的长度。提前谢谢!

【问题讨论】:

    标签: c++ arrays loops count


    【解决方案1】:

    如果您真的想使用固定大小的容器,请在现代 C++ 中使用 std::array 而不是 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,我还建议使用固定宽度的整数类型。

    【讨论】:

      【解决方案2】:

      其实sizeof()应该是这样的:

      sizeof(scores) / sizeof(scores[0])

      这将为您提供数组的总元素数。

      【讨论】:

        【解决方案3】:

        如果您改用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
        }
        

        第三个选项,正如我在 cmets 中提到的,将使用您从未使用过的值(通常为 -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++;
        }
        

        【讨论】:

        • 不幸的是,我必须坚持使用数组,我已经熟悉向量并且很容易选择它们,因为它们非常灵活,但作为一个挑战,我正在为此做数组。跨度>
        • 好的,那么您只需要保留一个计数器来记录您在数组中放入了多少值。另一个(可能更糟)的想法是将所有 1000 个值初始化为您从未使用过的某个值(可能是 -1),然后循环直到您遇到其中一个 -1。我会保留一个柜台。
        • 我确实有一个名为 scoreCount 的计数器,它可以做到这一点,你能用这个例子告诉我我的循环是什么样的吗?
        【解决方案4】:

        当您填充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++) {
            ...
        }
        

        还有一些其他选项需要考虑:

        • 使用标记值来表示数据的结尾,例如分数 -1。
        • 请改用std::vector

        顺便说一句,循环中的逻辑语句将始终为真。你确定你不是故意使用&amp;&amp; 而不是||

        【讨论】:

        • 是的,我想要与否,因为如果分数在 90 到 100 之间,那么它就是 A,我想把它放在 A 计数器中。因此,在遍历数组结束时,我将计算 A 的 B、C 等。
        • @user12074577 这意味着你想要一个“和”。 50 高于 90 还是 低于 100?
        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        相关资源
        最近更新 更多