C++调试函数的编写
ACM线下赛中,很多时候并不提供很强大的调试软件,这样,如果要想调试查看map或list等信息,需要自行编写输出中间结果。
这里提供一个通用框架,并附上示例,可以作为模板使用,提交代码时注释掉#define YLOFI和#define YDELO即可。
1 #define YLOFI 2 #define YDELO 3 4 #include<iostream> 5 #include<iomanip> 6 #include<cstdio> 7 #include<string> 8 #include<sstream> 9 #include<map> 10 #include<list> 11 #include<algorithm> 12 using namespace std; 13 #define YCOL1 10 14 struct yc2d{ 15 int a; 16 int b; 17 }; 18 19 #ifdef YDELO 20 //#include "YLog.h" 21 #include "assert.h" 22 int ydelon = 0; 23 int ydelom = 0; 24 //自定义类 25 ostream &operator<<(ostream &os,const yc2d &myclass){ 26 return os << myclass.a << " " << myclass.b; 27 } 28 //二维数组 29 template<typename T> 30 void yPrintArr(const T x[][YCOL1]){ 31 int i = 0; 32 while(1){ 33 cout << i; 34 for(int j = 0;j<ydelom;j++){ 35 cout << " (" << j << "," << x[i][j] << ")"; 36 } 37 i++; 38 if(i >= ydelon){ 39 break; 40 } 41 else{ 42 cout << endl; 43 } 44 } 45 return; 46 } 47 template<typename T> 48 bool yPrint(const string &info,const T x[][YCOL1],int n = 0,int m = 0,bool clr = true){ 49 if(clr){ 50 system("cls"); 51 } 52 cout << endl << "\\**********************" << endl << info << endl; 53 ydelon = n; 54 ydelom = m; 55 if(ydelon > 0 && ydelom > 0){ 56 yPrintArr(x); 57 } 58 else{ 59 return false; 60 } 61 cout << endl << "**********************\\" << endl; 62 return true; 63 } 64 //数组 65 template<typename T,int size> 66 void yPrintArr(const T (&x)[size]){ 67 int i = 0; 68 while(1){ 69 cout << i << " " << x[i]; 70 i++; 71 if(i >= ydelon){ 72 break; 73 } 74 else{ 75 cout << endl; 76 } 77 } 78 return; 79 } 80 template<typename T,int size> 81 bool yPrint(const string &info,const T (&x)[size],int n = 0,bool clr = true){ 82 if(clr){ 83 system("cls"); 84 } 85 cout << endl << "\\**********************" << endl << info << endl; 86 ydelon = n; 87 if(ydelon > 0){ 88 yPrintArr(x); 89 } 90 else{ 91 return false; 92 } 93 cout << endl << "**********************\\" << endl; 94 return true; 95 } 96 //非数组 97 template<typename T> 98 bool yPrint(const string &info,const T &x,int n = 0,bool clr = true){ 99 if(clr){ 100 system("cls"); 101 } 102 cout << endl << "\\**********************" << endl << info << endl; 103 ydelon = n; 104 if(ydelon >= 0){ 105 cout << x; 106 } 107 else{ 108 return false; 109 } 110 cout << endl << "**********************\\" << endl; 111 return true; 112 } 113 //list & map 114 template<typename T,typename S> 115 ostream &operator<<(ostream &os,const pair<T,S> &it){ 116 return os << it.first << " " << it.second; 117 } 118 template<typename T,typename S> 119 ostream &operator<<(ostream &os,const map<T,S> &st){ 120 int n = ydelon==0?st.size():ydelon,i = 0; 121 os << " size=" << st.size() << " show=" << n << endl; 122 for(typename map<T,S>::const_iterator it = st.begin();it!=st.end();it++){ 123 os << i << " " << *it; 124 i++; 125 if(i >= n){ 126 break; 127 } 128 else{ 129 os << endl; 130 } 131 } 132 return os; 133 } 134 template<typename T> 135 ostream &operator<<(ostream &os,const list<T> &st){ 136 int n = ydelon==0?st.size():ydelon,i = 0; 137 os << " size=" << st.size() << " show=" << n << endl; 138 for(typename list<T>::const_iterator it = st.begin();it!=st.end();it++){ 139 os << i << " " << *it; 140 i++; 141 if(i >= n){ 142 break; 143 } 144 else{ 145 os << endl; 146 } 147 } 148 return os; 149 } 150 #endif 151 152 int main(){ 153 #ifdef YLOFI 154 freopen("yin.txt","r",stdin); 155 //freopen("yout.txt","w",stdout); 156 #endif 157 #ifdef YDELO 158 assert(1); 159 #endif 160 map<int,int> ma; 161 ma[1] = 9; 162 ma[2] = 8; 163 ma[-1] = 7; 164 list<int> li; 165 li.push_back(33); 166 li.push_back(3); 167 int a = 3; 168 double f[10] = {1.1,2.2,3.3,4.4}; 169 yc2d myclass; 170 myclass.a = 3; 171 myclass.b = 2; 172 int arr2[4][YCOL1] = {{0,1,2},{2,1,0}}; 173 cout << "here could be clear." << endl; 174 #ifdef YDELO 175 assert(yPrint("ma1",ma,2)); 176 assert(yPrint("li",li,0,false)); 177 assert(yPrint("a",a,0,false)); 178 assert(yPrint("f",f,4,false)); 179 assert(yPrint("myclass",myclass,0,false)); 180 assert(yPrint("arr2",arr2,2,3,false)); 181 #endif 182 return 0; 183 }