【问题标题】:C++ : For Loop and VectorsC++:For循环和向量
【发布时间】:2014-04-13 03:55:46
【问题描述】:

我一直致力于 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:在函数'std::vector > solution(int, std::vector >&)'中:func.cpp:7:警告:比较 有符号和无符号整数表达式 func.cpp:11:警告:建议 赋值的括号用作真值

任何想法为什么它总是抛出这个错误?

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

【问题讨论】:

  • == 的诅咒...检查你的 if 子句..
  • 甚至没有注意到这一点。错误仍然存​​在,但这阻止了未来的问题
  • 当你说它不会循环时,你是什么意思?
  • 一种方式:for( auto value: A ) {....}(那是 C++11)。另一种方式:for( vector&lt;int&gt;::iterator i = A.begin(); i != A.end(); ++i ) { ...

标签: c++ vector


【解决方案1】:

正如编译器所建议的那样:

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

正在赋值 A.size() + 1 的值,而不是评估它们的相等性

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

可能是你想要的。

此外,size() 返回一个无符号整数,而不是 int,因此编译器对此提出了投诉。

【讨论】:

    【解决方案2】:

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

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

      for (int i = 0;i

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

      int 值 = A.at(i);

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

      如果(值 = A.size() + 1)

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

    【讨论】:

    • Compiler output: In file included from user.cpp:20: func.cpp: In function 'std::vector&lt;int, std::allocator&lt;int&gt; &gt; solution(int, std::vector&lt;int, std::allocator&lt;int&gt; &gt;&amp;)': func.cpp:9: warning: comparison between signed and unsigned integer expressions
    • 好吧,我正在尝试这个练习。 https://codility.com/demo/take-sample-test/max_counters。要解决它,您需要遍历向量。而且我没有做错。我按照您的详细说明进行操作
    • 对不起,我弄错了。我已将我的代码重置为主题 codility.com/c/run/demoGG9VAY-7G8 开始时的代码。也许你能看到我错过的东西。顺便说一句,= 是一个错字。我的意思是==。这是漫长的一天
    【解决方案3】:

    您收到两个不同的警告。第一个与这个问题有关:

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

    ...这只是一个错字,应该写成:

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

    一旦你解决了,你可以继续下一个警告:

    int 已签名。 A.size() 返回一个无符号值。您可以将for( int i = 0; i &lt; A.size(); ++i) 更改为for( size_t i = 0....

    由于您存储的所有整数都可能是正数,因此请使用适当的容器类型(例如,无符号)。下面是它的外观:

    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);
    }
    

    比较或分配一个无符号到一个有符号值得产生警告的原因是有符号容器和无符号容器的范围是不同的。

    【讨论】:

    • 我认为这是一个会诅咒我的问题,直到我了解更多相关信息。我放弃了这个练习,因为在我理解循环方面的向量之前,我的编程方式是行不通的。你知道一个好的教程吗?主要问题是获取 A.size() 的 int
    • 在我看来主要问题不是将A.size() 转换为int。如果您在向量 A 中存储的值始终为正,并且可以与 A.size 进行比较,那么您应该在向量中存储未签名的对象,而不是签名的对象。
    • 我不知道在线教程......对于书籍,很难击败“C++ Primer”(最新版本,not“The C++ Primer Plus ")
    • 哦,顺便说一句,返回值必须始终是 int。它是固定的。
    • 老实说,我对 static_cast、已签名和未签名的所有内容感到迷茫。能不能给个解释。他们在做什么?它们有何不同?
    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多