C ++:For Loop和Vectors

时间:2014-04-12 19:14:34

标签: c++ vector

我一直致力于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:警告:建议     用作真值的赋值括号

  

任何想法为什么它一直在抛出这个错误?

编辑:从其他测试看,很明显,无论我做了什么练习,我都会得到这个错误。因此,我得出结论,我还没有理解循环向量。循环遍历向量的正确方法是什么?

3 个答案:

答案 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)

您的程序应按以下方式更新

  1. 这应避免比较有符号和无符号整数之间的比较。

    for(int i = 0; i&lt; A.size(); i ++)

  2.    for (vector<int>::size_type i = 0;i < A.size();i++)
    
    1. 由于你的循环正在处理 size(),你应该使用[]运算符而不是作为 在内部,它确实检查了越界访问。这是可以避免的。

      int value = A.at(i);

    2.  int value = A[i];
      
      1. 这实际上是一个主要问题,在您的代码中,因为您使用了=而不是==。

        if(value = A.size()+ 1)

      2.    if (value == A.size() + 1)