首页 > 解决方案 > C++ 错误中的计时时间计数器问题:运算符不匹配

问题描述

#include <iostream>
#include <chrono>
#include <unistd.h>
using namespace std;

void SieveOfEratosthenes (int n)
{
    bool prime[n+1], flag=true;
    int counter=0, ct=0;
    for (int i =0;i<n+1;i++){
        prime[i]=true;
    }
    for (int p=2; p*p<=n; p++)
    {
        if (prime[p]==true)
        {
            for (int i=p*2; i<=n; i += p)
            {
                prime[i] = false; 
            }
        }
    }
   // Print all prime numbers 
    for (int p=2; p<=n; p++)
    {
        if (flag)
        {
              auto begin=chrono::high_resolution_clock::now();
        }
        if (prime[p])
        {
              cout << p << " ";
              counter+=1;
              flag=false;
        }
        if(counter==10)
        {
              auto end=chrono::high_resolution_clock::now();
              auto duration=chrono::nanoseconds(end-begin);
              cout<<"Time elapsed:"<<duration.count();
              counter=0;
              flag=true;
        }
    }
    cout<<endl;
}


int main()
{
     int n;
     cout<<"Type a number:";
     cin>>n;
     cout<<endl<<"Following are the prime numbers smaller or equal to:"<<n<<endl;
     SieveOfEratosthenes(n);
     return 0;
}
// Driver Program to test above function 

这是一种查找小于 n 的素数(从键盘给出)的算法,我想每找到 10 个素数得到时间。我遇到操作员错误,它在(结束)。我不明白错误在哪里是。我试图在单独的 .o 文件中编写函数,但仍然一无所获。任何帮助将不胜感激。!

enter image description here

标签: c++timeoperator-keywordchrono

解决方案


begin是在一个if块内定义的,它不能被end-begin. 一个简单的解决方法是将定义移出for-loop:

      decltype(chrono::high_resolution_clock::now()) begin;                                                                                                                                    
     // Print all prime numbers                                                                                                                                                                
      for (int p=2; p<=n; p++)                                                                                                                                                                 
      {                                                                                                                                                                                        
          if (flag)                                                                                                                                                                            
          {                                                                                                                                                                                    
                begin=chrono::high_resolution_clock::now();                                                                                                                                    
          }
          // ...
      }

注意using namespace std全局设置通常是个坏主意。由于begin与 碰撞std::begin,错误消息变得复杂。如果你改为 write namespace chrono = std::chrono; using std::cout;,错误会变得更清楚:

test.cpp: In function ‘void SieveOfEratosthenes(int)’:
test.cpp:41:53: error: ‘begin’ was not declared in this scope; did you mean ‘std::begin’?
   41 |               auto duration=chrono::nanoseconds(end-begin);
      |                                                     ^~~~~
      |                                                     std::begin

推荐阅读