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;iA[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";
}