【问题标题】:terminate called after throwing an instance of 'std::out_of_range' what(): array::at: __n (which is 1990878449) >= _Nm (which is 5)在抛出 'std::out_of_range' what(): array::at: __n (即 1990878449) >= _Nm (即 5) 的实例后调用终止
【发布时间】:2021-02-22 07:32:27
【问题描述】:
 array<int,5> ar3;
  for(auto i : ar3){
    ar3.at(i) = i+1;
    cout<<ar3.at(i)<<" ";
  }
  cout<<endl;

上面是我运行的一段代码,弹出如下错误

在抛出 'std::out_of_range' 的实例后调用终止 what(): array::at: __n (即 1990878449) >= _Nm (即 5)

我错过了什么/出了什么问题?

谢谢

【问题讨论】:

  • 范围循环迭代元素,而不是索引。

标签: c++ arrays stl


【解决方案1】:

std::array 是一个普通的聚合,当你声明一个这样的实例时,

std::array<int, 5> a;

初始化它的任何成员值。因此,数组中的所有ints 都包含一些随机垃圾值。接下来,遍历数组的

for (auto i : a) { /* .. */ }

循环变量i 将在迭代期间保存这些垃圾值,一次一个,直到访问数组越界

ar.at(i) // again: i can be anything

看来您想要做的是让i 从零增加到size - 1。为此使用一个很好的旧 for 循环:

for (int i = 0; i < ar3.size(); ++i)
{
    ar3.at(i) = i + 1;
}

【讨论】:

    【解决方案2】:

    当你这样做时:

    for (auto i : ar3)
    

    就像:

    for (int x = 0; x < ar3.size(); x++) {
        i = ar3.at(x);
        // here the for (auto i : ar3) start
    }
    

    但是你没有初始化ar3 的值,所以你里面有随机数。因此,在您的循环中,您尝试访问array 的随机大小写。 要解决这个问题,您可以初始化您的数组或不使用for (auto i : ar3),但是:

    for (int i = 0; i < ar3.size(); i++) {
        ar3.at() = i + 1;
    }
    

    【讨论】:

    • 错字:ar3.at()
    【解决方案3】:

    来自std::array

    默认初始化可能导致非 T 类的不确定值)

    int 确实会发生这种情况,读取这些值会使您的程序具有未定义的行为。

    如果您的目标是用值 1-5 填充 std::array,您可以改用 std::iota

    #include <array>
    #include <numeric> // std::iota
    
    int main() {
        std::array<int, 5> ar3;
        std::iota(ar3.begin(), ar3.end(), 1); // start at 1
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2021-01-02
      • 2017-03-08
      相关资源
      最近更新 更多