【问题标题】:adding numbers 100-299 to an array [closed]将数字 100-299 添加到数组 [关闭]
【发布时间】:2019-02-13 20:54:50
【问题描述】:

我正在尝试创建一个包含 200 个整数的数组,其中填充了整数 100-299。我目前有这个:

int myArray[200];

int j;

for(j = 100; j < 300; j++){

    myArray[j] = j;

}

当我显示myArray[0]myArray[200] 时,它会显示随机的垃圾数字,所以我知道我的数组没有正确填充。我还有另一个数组,其中填充了 0-99 的 ints,它按预期工作。

【问题讨论】:

  • 你从不写信给myArray[0],所以你不应该期望它包含任何有意义的值
  • 您正在迭代索引 100 到 299 处的元素,但您的数组的有效索引介于 0 到 199 之间。您的意思可能是 myArray[j-100] = j; 而不是 myArray[j] = j;
  • 既然j 可以高达299,那么当你给myArray[299] 赋值时,考虑到数组只有200 个元素,你认为会发生什么?
  • 我还有另一个数组,其中填充了 0-99 的整数,它按预期工作。 -- 那是因为你很幸运你从 0 开始。你从来没有意识到如果您从不同的号码开始,该代码将不起作用。如果您从 -100 开始到 100 for (int j = -100; j &lt;= 100; ++j),您的代码将如何工作? myArray[-100] 对你有意义吗?
  • 有时您只需要仔细查看您编写的代码并问自己它实际上在做什么,而不是您认为它在做什么。

标签: c++ arrays


【解决方案1】:

由于 j 从 100 到 299 循环,myArray[j] 永远不会填满 myArray 的 0-99 元素,并且在循环的后半部分超出范围。

你想要:

for (j = 0; j < 200; j++)
{
    myArray[j] = j+100;
}

【讨论】:

    【解决方案2】:
    int myArray[200];
    
    int j;
    //when you say arr[j] with j = 200 for example and you array goes from 0 to 199 of course you will get an error
    for(j = 100; j < 300; j++){
       // you are confusing between index of the array you are trying to access  & the the value  to assign it
      //with j-100 now it will go from 100-100=0 to 299-100=199 
        myArray[j-100] = j;
    
    }
    

    【讨论】:

      【解决方案3】:

      其他答案已经证明了您的错误,但我想使用std::iota 展示另一种方法:

      int myArray[200];
      std::iota(std::begin(myArray), std::end(myArray), 100);
      

      【讨论】:

        【解决方案4】:

        您的第一个数组索引从 100 开始,而不是从 0。 int myArray[200] 表示从 0 到 199 的索引。

        【讨论】:

          【解决方案5】:

          正如其他人所说,您的循环使用了错误的数组索引。数组总是从索引 0 开始,与存储在数组中的值无关。

          您可以(并且应该)使用标准算法来避免使用手动循环,从而避免此类陷阱。

          std:::generate()std::generate_n()

          #include <algorithm>
          
          struct startAt
          { 
              int num;
          
              startAt(int start) : num(start) {}
          
              int operator() ()
              {
                  return num++;
              }
          }
          
          std::generate(myArray, myArray+200, startAt(100));
          or
          std::generate_n(myArray, 200, startAt(100));
          

          或者,如果使用 C++11 或更高版本:

          #include <array>
          #include <algorithm>
          
          std::array<int, 200> myArray;
          
          std::generate(myArray,begin(), myArray.end(), [n = 100] () mutable { return n++; });
          or
          std::generate_n(myArray,begin(), 200, [n = 100] () mutable { return n++; });
          

          或者,使用 std::itoa() 代替:

          #include <array>
          #include <numeric>
          
          std::array<int, 200> myArray;
          
          std::iota(myArray.begin(), myArray.end(), 100);
          

          【讨论】:

            【解决方案6】:

            要用数字序列填充原始数组,std::iota(来自&lt;numeric&gt;)在std::beginstd::end(都来自&lt;iterator&gt;)的帮助下发挥了作用。

            using ... 的使用方式与我们应用std::swap 的方式相同,因此如果有更好的begin/end 方法专用可用,则选择容器的正确版本。因此,如果您决定您的容器应该是 std::vectorstd::array,您将不必修改太多或根本不需要修改代码。

            #include <numeric>
            #include <iterator>
            
            int myArray[200];
            using std::begin;
            using std::end;
            std::iota(begin(myArray), end(myArray), 100); // this parts is usually within a function body
            

            【讨论】:

            • 这个答案出现在 SO.. 的低质量帖子中。你能在你的答案中添加任何评论吗?解释你的逻辑,并对你的代码打算做什么做一点评论。这将有助于 OP,但它也将作为未来用户的评论
            猜你喜欢
            • 2013-02-13
            • 2020-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多