cerr
You can use cerr
instead of cout
to debug. cerr
writes to the standard error stream which is not seen by the online judge.
Example:
instead of cout << "x is " << x << '\n';
you can use cerr << "x is " << x << '\n';
One drawback of this is that cerr
increase the runtime of a program. The runtime of the below program would decrease if the cerr
statements were removed.
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
cout << i*j << "\n";
cerr << "i is " << i << "\n"
cerr << "j is " << j << "\n"
}
}
We are facing a trade-off between coding time and running time.
When our solution seems good, we should remove some debugging statements which consume some time.
To redirect cerr
to a file we have three options(source: https://askubuntu.com/questions/625224/how-to-redirect-stderr-to-a-file):
Redirect stdout to one file and stderr to another file:
command > out 2>error
Redirect stderr to stdout (
&1
), and then redirect stdout to a file:command >out 2>&1
Redirect both to a file:
command &> out
Watch Macro
This macro is an easy way to debug variables. It also prints the name of the variable:
#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl
You can use it like this:
#include<bits/stdc++.h>
using namespace std;
#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl;
int main()
{
int n;
n = 2*2;
watch(n); //output : n is 4
int exponent = 2;
watch(pow(n,exponent)); //output: pow(n,exponent) is 16
}