我一直致力于Codility的MaxCounters任务。而且我被困住了。无论我尝试什么,下面的代码都不会循环
// you can also use includes, for example:
// #include <algorithm>
vector<int> solution(int N, vector<int> &A)
{
vector<int> counter (N,0);
for (int i = 0;i < A.size();i++)
{
int value = A.at(i);
if (value = A.size() + 1)
{
}
else
counter[value - 1] += 1;
}
return (counter);
}
我使用这个网站找到了解决我问题的方法,但无济于事。我一直收到此错误消息。
user.cpp中包含的文件:20:func.cpp:在函数&#39; std :: vector&gt;解决方案(int,std :: vector&gt;&amp;)&#39 ;: func.cpp:7:警告:比较 有符号和无符号整数表达式func.cpp:11:警告:建议 用作真值的赋值括号
任何想法为什么它一直在抛出这个错误?
编辑:从其他测试看,很明显,无论我做了什么练习,我都会得到这个错误。因此,我得出结论,我还没有理解循环向量。循环遍历向量的正确方法是什么?答案 0 :(得分:3)
正如编译器所建议的那样:
if (value = A.size() + 1)
指定值为A.size()+ 1的值,而不是评估它们的相等性
if (value == A.size() + 1)
可能是你想要的。
此外,size()
返回unsigned int,而不是int
,因此编译器会对此进行投诉。
答案 1 :(得分:0)
您收到两个不同的警告。第一个涉及这个问题:
if( value = A.size() + 1)
...这只是一个错字,应该写成:
if( value == A.size() + 1 )
一旦您决定可以继续下一个警告:
int
已签名。 A.size()
返回无符号值。您可以将for( int i = 0; i < A.size(); ++i)
更改为for( size_t i = 0....
。
由于您存储的所有int都可能是正数,因此请使用适当的容器类型(例如,unsigned)。以下是它的外观:
vector<unsigned> solution(int N, vector<unsigned> &A)
{
vector<unsigned> counter (N,0);
for (size_t i = 0;i < A.size();i++)
{
unsigned value = A.at(i);
if ( value == A.size() + 1 )
{
}
else
counter[value - 1] += 1;
}
return (counter);
}
比较或分配unsigned与signed的值得生成警告的原因是签名容器与未签名容器的范围不同。
答案 2 :(得分:0)
您的程序应按以下方式更新
这应避免比较有符号和无符号整数之间的比较。
for(int i = 0; i&lt; A.size(); i ++)
要
for (vector<int>::size_type i = 0;i < A.size();i++)
由于你的循环正在处理 size(),你应该使用[]运算符而不是作为 在内部,它确实检查了越界访问。这是可以避免的。
int value = A.at(i);
要
int value = A[i];
这实际上是一个主要问题,在您的代码中,因为您使用了=而不是==。
if(value = A.size()+ 1)
要
if (value == A.size() + 1)