【问题标题】:Getting command terminated when trying to display element of a vector尝试显示矢量元素时终止命令
【发布时间】:2021-04-02 23:14:11
【问题描述】:

所以我是 C++ 新手,我正在尝试制作这个程序。程序的要点是:你输入一个数组,程序会计算出哪个子数组的和为奇数,并打印出该子数组有多少个元素。

#include <iostream>
#include <vector>

using namespace std;

void swap(int *x,int *y){
    int temp=*x;
    *x=*y;
    *y=temp;
}

void subarr(vector<int> arr,int start, int end){
    vector<int> a;
    vector<int> A;  
    int sum=0;
    if(end==arr.size())
        return;
    else if(start>end)
        subarr(arr,0, end+1);
    else{
        for(int i=start;i<end+1;i++){
            sum+=arr[i];
        }
        int num_of_elements=(end+1)-start;
        a.push_back(sum);
        A.push_back(num_of_elements);
        subarr(arr,start+1,end);
    }

    for(int j=100;j<a.size();j++){
        if(a.at(j)%2!=0){
            if(a.at(j)>a.at(0)){
                swap(&a.at(j),&a.at(0));
                swap(&A.at(j),&A.at(0));
            }
        }
        else{
            a.at(j)=-1;
        }
    }
    cout<<A.at(0);

    return;
}

int main(){
    int elements;
    cout<<"Enter number of elements: ";
    cin>>elements;

    int a[elements];

    cout<<"Enter "<<elements<<" elements in an array: ";
    for(int i=0;i<elements;i++){
        cin>>a[i];
    }

    vector<int> arr;
    for(int i=0;i<elements;i++){
        arr.push_back(a[i]);
    }
    
    subarr(arr,0,0);

    return 0;
}

它编译没有错误。我运行它,它让我输入所有输入,但随后我收到以下消息:

在抛出 'std::out_of_range' 的实例后调用终止 what(): vector::_M_range_check: __n (0) >= this->size() (0)

【问题讨论】:

  • *x,*y; 在交换函数中应该是*x = *y;
  • @Krishna Kanth Yenumula 仍然无法正常工作,出现同样的错误
  • 为什么要设置参数 Start 和 End ?虽然你可以从 arr.size()
  • @JaziriRami 这对我来说更简单,这可能是导致错误的原因吗?
  • 请不要修复您问题中的代码。修复是为了答案。我回滚了您的编辑,因为更新后一半的答案毫无意义

标签: c++ vector stdvector terminate


【解决方案1】:

您的错误来自这一行:

cout<<A.at(0);

您必须小心访问 A 的给定大小之外的元素。因为您只能访问位置 0 的项目,所以向量中有一个项目。

terminate called after throwing an instance of 'std::out_of_range'

也为此:

for(int j=100;j<a.size();j++){
    if(a.at(j)%2!=0){

确保您确实打算访问 a 的第 100 个元素。

跟踪程序:

  • 它以 subarr(arr,0,0); 开头,然后向A 向量添加一些内容。
  • 然后调用subarry(arr,1,0),然后调用subarray(arr,1,1)
  • subarray(arr,1,1) 返回,跳转到subarray(arr,1,0) 的函数调用
  • 然后您又回到了没有向aA 添加任何内容的函数调用,跳过for 循环然后转到无效的打印A.at(0)

【讨论】:

  • 我改为 int j=0,这显然是我的错误,但显然我没有将任何元素放入数组中,即使我确实使用了 push_back
  • @bb_823 因为subarr(arr,0, end+1); 被调用以开始1 和结束0,然后返回。所以在第一个 if 语句块中,没有任何东西被添加到 A。有些东西确实被添加到了 A,但是在前面的堆栈中,当你递归调用该函数时,A 将被初始化为一个新值。
  • 所以从技术上讲,我的代码存在根本缺陷,我应该这样做: void subarr(vector arr,int start, int end, vector a,vector A)我目前的 subarr 功能。我将在我的主函数中声明 vector a 和 vector A
  • @bb_823 我建议您避免使用递归(在自身内部调用相同的函数),并使用 for 循环来遍历数组的不同长度。如果您愿意,您可以查看诸如 accumulate 之类的函数和迭代器,例如int sum = std::accumulate(v.begin(), v.end(), 0);。慢慢来,边走边学,然后你总是可以为另一个特定问题打开另一个问题。希望有帮助
猜你喜欢
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2021-01-29
  • 2021-01-18
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多