C++11 为什么存储在整数中的向量值会给出不同的结果? 我最近开始使用C++中的向量。我试图编写的程序的目的是确定第一个缺失的正数。给定一个输入数组A:[-9,12,1,0,1]预期输出为2。我把它编码了- int Solution::firstMissingPositive(vector<int> &A) { std::sort(A.begin(),A.end()); //sorting vector bool Negative=false; int flag; int i=0; for(i=0;i<A.size();++i) { if(A[i]<=0) { Negative=true; std::cout<<"\nwe found a -ve number or 0"; } else if( (A[i]>0) && (A[i+1]!=A[i]+1) ) { Negative=false; std::cout<<"\ncomparing @ ="<<i<<" which = "<<A[i]; std::cout<<"\ncomparing @ ="<<i+1<<" which = "<<A[i+1]; flag=A[i]+1; //The faulty statement std::cout<<"\n\n missing number(A[i]+1) @ ="<<A[i]+1; std::cout<<"\n\n missing number(flag) @ ="<<flag; break; } } //do something more }

C++11 为什么存储在整数中的向量值会给出不同的结果? 我最近开始使用C++中的向量。我试图编写的程序的目的是确定第一个缺失的正数。给定一个输入数组A:[-9,12,1,0,1]预期输出为2。我把它编码了- int Solution::firstMissingPositive(vector<int> &A) { std::sort(A.begin(),A.end()); //sorting vector bool Negative=false; int flag; int i=0; for(i=0;i<A.size();++i) { if(A[i]<=0) { Negative=true; std::cout<<"\nwe found a -ve number or 0"; } else if( (A[i]>0) && (A[i+1]!=A[i]+1) ) { Negative=false; std::cout<<"\ncomparing @ ="<<i<<" which = "<<A[i]; std::cout<<"\ncomparing @ ="<<i+1<<" which = "<<A[i+1]; flag=A[i]+1; //The faulty statement std::cout<<"\n\n missing number(A[i]+1) @ ="<<A[i]+1; std::cout<<"\n\n missing number(flag) @ ="<<flag; break; } } //do something more },c++11,vector,C++11,Vector,我觉得这很有趣,因为在我看来,我不能用整数来存储向量的值 试图调试它时,我发现将标志分配更改为flag=A[I]+2会使结果打印30 我已经阅读了关于SO的其他问题,其中建议使用vector.at(I)而不是[]操作符作为更好的练习。更改此项不会反映对我的代码的任何更改 将标志更改为向量会产生一个我不确定的错误 A[i]+1在语法上不等于一个整数值吗?如果是,为什么我不能存储它?将代码缩减为MCVE可以很快证明问题出在输出格式上,因此将“\n”放在语句开头是不常见的做法。你看到的不是20,你

我觉得这很有趣,因为在我看来,我不能用整数来存储向量的值

  • 试图调试它时,我发现将标志分配更改为
    flag=A[I]+2
    会使结果打印
    30
  • 我已经阅读了关于SO的其他问题,其中建议使用
    vector.at(I)
    而不是
    []
    操作符作为更好的练习。更改此项不会反映对我的代码的任何更改
  • 标志
    更改为
    向量
    会产生一个我不确定的错误

A[i]+1
在语法上不等于一个整数值吗?如果是,为什么我不能存储它?

将代码缩减为MCVE可以很快证明问题出在输出格式上,因此将“\n”放在语句开头是不常见的做法。你看到的不是20,你看到的是来自标志的“2”,后面是打印在别处的零

#include <algorithm>
#include <iostream>
#include <vector>

void solve(std::vector<int>& A)
{
    std::sort(A.begin(),A.end());    //sorting vector

    bool Negative=false;
    int flag;
    int i=0;

    for(i=0;i<A.size();++i)
    {
        if(A[i]<=0)
        {
            Negative=true;
            std::cout<<"we found a -ve number or 0\n";
        }
        else if( (A[i]>0) && (A[i+1]!=A[i]+1) )
        {
            Negative=false;
            std::cout<<"comparing @ ="<<i<<" which = "<<A[i]<<'\n';
            std::cout<<"comparing @ ="<<i+1<<" which = "<<A[i+1]<<'\n';

            flag=A[i]+1; //The faulty statement

            std::cout<<"missing number(A[i]+1) @ ="<<A[i]+1<<'\n';
            std::cout<<"missing number(flag) @ ="<<flag<<'\n';
            break;
        }

    }
//do something more
}

int main() {
    std::vector<int> A { -9, 12, -1, 0, 1 };
    solve(A);
    std::cout << "and we're done\n";
}
我还应该指出,如果您对“A[I+1]”的测试试图读取数组中的最后一个元素,那么它将导致对数组的越界访问。你应该改变

for(i=0;i<A.size();++i)

for(i=0;i

将代码简化为MCVE可以很快证明问题出在输出格式上,正是出于这个原因,将“\n”放在语句开头是一种不常见的做法。您没有看到20,您看到的是“2”from标志,后面是在其他地方打印的零

#include <algorithm>
#include <iostream>
#include <vector>

void solve(std::vector<int>& A)
{
    std::sort(A.begin(),A.end());    //sorting vector

    bool Negative=false;
    int flag;
    int i=0;

    for(i=0;i<A.size();++i)
    {
        if(A[i]<=0)
        {
            Negative=true;
            std::cout<<"we found a -ve number or 0\n";
        }
        else if( (A[i]>0) && (A[i+1]!=A[i]+1) )
        {
            Negative=false;
            std::cout<<"comparing @ ="<<i<<" which = "<<A[i]<<'\n';
            std::cout<<"comparing @ ="<<i+1<<" which = "<<A[i+1]<<'\n';

            flag=A[i]+1; //The faulty statement

            std::cout<<"missing number(A[i]+1) @ ="<<A[i]+1<<'\n';
            std::cout<<"missing number(flag) @ ="<<flag<<'\n';
            break;
        }

    }
//do something more
}

int main() {
    std::vector<int> A { -9, 12, -1, 0, 1 };
    solve(A);
    std::cout << "and we're done\n";
}
我还应该指出,如果您对“A[I+1]”的测试试图读取数组中的最后一个元素,那么它将导致对数组的越界访问

for(i=0;i<A.size();++i)

(i=0;i

A[i+1]
是一个禁止使用的选项access@PiotrSkotnicki仅在最后一次迭代中,输入时不应该碰到它。我怀疑您或您用于运行此操作的任何脚本正在打印
0
,可能是为了返回代码。请在打印
标志后尝试打印
'\n'
@PiotrSkotnicki Shoul如果((A[I]>0)和((A[I+1]!=A[I]+1)和((I!=A.size()-1))
?我没有访问运行此代码的脚本的权限。我使用的是在线编译器。打印
\n
修复了它。谢谢@T.C。非常抱歉打扰。请关闭此问题。
A[I+1]
是一个禁止使用的选项access@PiotrSkotnicki仅在最后一次迭代中,输入时不应该碰到它。我怀疑您或您用于运行此操作的任何脚本正在打印
0
,可能是为了返回代码。请在打印
标志后尝试打印
'\n'
@PiotrSkotnicki Shoul如果((A[I]>0)和&(A[I+1]!=A[I]+1)和&(I!=A.size()-1))的话,我会将其编辑为
else吗
?我没有访问运行此代码的脚本的权限。我正在使用联机编译器。打印
\n
可以修复此问题。感谢@T.C。非常抱歉打扰您。请关闭此问题。感谢您告诉我应该采用什么做法!非常有帮助。感谢您告诉我应该采用什么做法!非常有帮助。
for(i=0;i<A.size() - 1;++i)
for(i=1;i<A.size();++i)
#include <algorithm>
#include <iostream>
#include <vector>

void solve(std::vector<int>& A)
{
    std::sort(A.begin(),A.end());    //sorting vector

    int expected = 0;
    int missing = 0;

    for(int i = 1; i < A.size(); ++i)
    {
        if (A[i] <= 0) {
            std::cout << "we found " << A[i] << "\n";
            continue;
        }

        if (A[i-1] <= 0) {
            expected = 1;
        } else {
            expected = A[i-1] + 1;
        }
        if (A[i] == expected)
            continue;

        std::cout << "A[" << i-1 << "] = " << A[i-1] << '\n';
        std::cout << "expecting " << expected << '\n';
        std::cout << "A[" << i << "] = " << A[i] << '\n';

        missing = expected;         
        std::cout << "missing number: " << expected << '\n';

        break;
    }
//do something more
}

int main() {
    std::vector<int> A { -9, 12, -1, 0, 1 };
    solve(A);
    std::cout << "and we're done\n";
}