1 #include <windows.h> 2 #include <iostream> 3 #include <stdio.h> 4 #include <string> 5 #include <cstring> 6 #include <cctype> 7 8 #include <initializer_list> //函数可变参数模板.和vector类似 9 #include <cassert> //assert()的头文件 10 11 //STL 12 #include <stack> //堆栈 13 #include <map> //字典 14 #include <list> //链表 15 #include <vector> //数组 16 #include <queue> //队列 17 #include <deque> //动态数组 18 19 20 using namespace std; 21 22 typedef struct listNode //节点对象 23 { 24 //1.数据域 25 int data; 26 27 28 //2.链接域 or 指针域 29 struct listNode *link; 30 }node; 31 32 33 node *create3()//创建3个节点的链表 34 { 35 node *first, *second, *third; 36 37 first = (node *)malloc(sizeof(node));//给第1个节点分配内存空间,并且指针转换 38 second = (node *)malloc(sizeof(node)); 39 third = (node *)malloc(sizeof(node)); 40 41 third->link = NULL;//最后1个元素的地址应该是null 42 third->data = 30; 43 second->link = third; 44 second->data = 20; 45 first->link = second; 46 first->data = 10; 47 48 49 return first; 50 } 51 52 53 //测试编译器的一些函数相关东西 54 void CompilerTest() 55 { 56 #ifndef NDEBUG 57 cerr << __FUNCDNAME__ << endl; 58 cerr << __FUNCTION__ << endl; 59 cerr << __FILE__ << endl;//文件路径 60 cerr << __LINE__ << endl; 61 cerr << __TIME__ << endl; 62 cerr << __TIMESTAMP__ << endl; 63 cerr << __DATE__ << endl; 64 65 cout << "这些信息通常都可以作为log的辅助信息" << endl; 66 #endif 67 } 68 69 70 71 void show_Test() 72 { 73 node *list = create3(); 74 75 cout << list->link->link->data << endl; 76 77 78 while (NULL != list) 79 { 80 cout << list->data << endl; 81 list = list->link; 82 } 83 84 delete list; 85 list = NULL; 86 } 87 88 //初始化次数 89 size_t count_calls() 90 { 91 static size_t ctr = 0;//不再经过 这一句 92 return ++ctr; 93 } 94 95 96 97 //可变形参 98 void error_msg(initializer_list<int> ilist) 99 { 100 auto beg = ilist.begin(); 101 auto end = ilist.end(); 102 103 while (beg != end) 104 { 105 cout << *beg << " "<<endl; 106 ++beg; 107 } 108 } 109 110 111 //不可以返回函数内部的定义的 引用和指针...,卧槽,可以的哦 流弊了 112 int& func() 113 { 114 115 int a = 10; 116 int &r = a; 117 return r; 118 119 } 120 121 //返回类型是左值的函数可以写在 = 的左边 122 char& get_val(string &str, string::size_type ix) 123 { 124 return str[ix]; 125 } 126 127 128 //测试 assert()函数 129 void AssertTest() 130 { 131 int x = 10; 132 assert(!x); 133 134 return; 135 } 136 137 //范围for,与引用 138 void ForRange() 139 { 140 vector<int> v; 141 v.push_back(0); 142 v.push_back(0); 143 v.push_back(0); 144 v.push_back(0); 145 146 int i = 0; 147 for (auto &r : v) 148 { 149 r = 1; 150 cout << v[i] << endl; 151 } 152 } 153 154 //getline 155 void GetLineTest() 156 { 157 string line; 158 while (getline(cin, line)) 159 { 160 cout << line.size() << endl; 161 cout << line.length() << endl; 162 163 cout << line << endl; 164 } 165 getline(cin, line); 166 cout << line << endl; 167 168 } 169 170 171 172 struct Student 173 { 174 Student() = default; 175 176 177 }; 178 179 class ObjectSize 180 { 181 public: 182 int a; 183 int b; 184 int c; 185 double d; 186 187 188 }; 189 190 class Screen 191 { 192 public: 193 typedef std::string::size_type pos; 194 Screen() = default; 195 196 Screen(pos ht, pos wd, char c) : height(ht), width(wd) 197 {} 198 199 private: 200 pos cursor = 0; //暂时不明白这个地方为啥有值了呢???????????????????????????? 201 pos height = 0; 202 pos width = 0; 203 string contents; 204 205 }; 206 207 //string size() length() 208 void StringVar() 209 { 210 string a = "abc"; 211 cout << a.length() << endl; 212 213 214 string str("123456"); 215 auto len = str.size(); 216 cout << len << endl; 217 218 219 220 221 string str2 = "panzhengming"; 222 for (auto c:str2) 223 { 224 cout << c << " "; 225 } 226 } 227 228 //迭代器会移动的 229 void MoveIter() 230 { 231 const int sz = 10; 232 int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 233 auto pBegin = begin(arr); 234 auto pEnd = end(arr); 235 236 while (pBegin != pEnd) 237 { 238 cout << *pBegin << " "; 239 pBegin++; 240 } 241 242 cout << endl; 243 pBegin = begin(arr); 244 pEnd = end(arr); 245 while (pBegin != pEnd) 246 { 247 *pBegin = 0; 248 249 pBegin++; 250 } 251 252 pBegin = begin(arr); 253 pEnd = end(arr); 254 while (pBegin != pEnd) 255 { 256 cout << *pBegin << " "; 257 pBegin++; 258 } 259 } 260 261 //迭代器的用法 262 void Iter1() 263 { 264 int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 265 vector<int> ivec(begin(arr), end(arr)); 266 auto Iter = ivec.begin(); 267 while (Iter != ivec.end()) 268 { 269 cout << *Iter << " "; 270 271 Iter++; 272 } 273 } 274 275 //for语句的第1个表达式只执行1次初始化!!! 276 void ForExp1() 277 { 278 vector<int> iver; 279 iver.push_back(0); 280 iver.push_back(0); 281 iver.push_back(0); 282 iver.push_back(0); 283 284 for (int i = 0, sz = iver.size(); i != sz; i++) 285 { 286 iver.push_back(iver[i]); 287 cout << "hello" << endl; 288 cout << sz << endl; 289 } 290 cout << iver.size() << endl; 291 } 292 293 //位操作 294 void BitTest() 295 { 296 int bits = 0233; 297 cout << bits << endl; 298 bits << 8; 299 cout << bits << endl; 300 bits >> 3; 301 cout << bits << endl; 302 bits = 0227; 303 ~bits; 304 cout << bits << endl; 305 306 307 } 308 309 // 310 void ForTest2() 311 { 312 for (size_t i = 0; i != 10; ++i) 313 { 314 cout << count_calls() << endl; 315 } 316 } 317 318 //函数返回值作为左值 319 void FuncValueAsLeft() 320 { 321 string s = "hello world"; 322 get_val(s, 0) = 'a'; //函数返回左值 323 cout << s << endl; 324 } 325 326 327 328 //指针转换 329 void CastPoint() 330 { 331 //----------------------------------------------------------------1 332 //double dval; 333 //int ival; 334 //int *p; 335 //dval = p = 0; 336 //----------------------------------------------------------------2 337 338 //double dval = 10.1; 339 //void *p = &dval; 340 //cout << &dval << " " << p << endl; 341 ////cout << *p << endl; 错误 342 //double *dp = static_cast<double *>(p); 343 //cout << dp << " " << *dp << endl; 344 345 //----------------------------------------------------------------3 346 //int i = 110; 347 //int *ip = &i; 348 //char *pc = (char *)ip; 349 //cout << ip << " " << *pc << endl; 350 351 //----------------------------------------------------------------4 352 //int i = 10; 353 //{ 354 // int *p = &i; 355 // cout << *p << "1111"<<endl; 356 //} 357 //cout << *p << endl; 358 } 359 360 //检查对象大小 361 void TestObjectSize() 362 { 363 cout << sizeof(ObjectSize) << endl;//内存空间大小 364 ObjectSize tempObj; 365 cout << sizeof(tempObj) << endl; 366 } 367 368 //const 练习 369 void ConstTest() 370 { 371 //变量是可读可写的 372 //常量是只读不可写的 373 //const赋值时,左边的读写权限要 <= 右边的读写权限 374 375 int x = 3; 376 int y = 4; 377 378 int const *p = &x; 379 cout << *p << endl; 380 x = 5; 381 cout << *p << endl; 382 383 //*p = 1; 错误 *p是常量 384 385 int *const p2 = &x; 386 cout << x << "," << *p2 << "," << p << endl; 387 *p2 = 11; 388 cout << x << "," << *p2 << "," << p << endl; 389 //p2 = &y; 错误 p2是常量 390 391 392 cout << "-------------------------" << endl; 393 int b = 50; 394 const int *p3 = &b; 395 b = 39; 396 cout << *p3 << endl; 397 //*p3 = 100; 398 399 cout << "-------------------------" << endl; 400 int ii = 0; 401 const int ci = 42; 402 ii = ci; 403 //ci = ii; 404 cout << ii << "," << ci << endl; 405 406 /* 407 网上查的结果 408 我理解的const是一种约定,是说我用了const就不会改变变量的值了,而其他人乱动我也没办法。 409 我是不是可以简单理解为,顶层是指 自己 不变,底层是指 所指向的 对象不变 410 411 1, 只有在使用指针的时候我们才说const分为 顶层(top)const 和 底层(bottom)const. 412 2, 右值引用你还用const你有毒吧. 413 3, 如果是两个指针之间相互拷贝其 底层(bottom)const 起到很关键的作用. 414 415 https://my.oschina.net/SHIHUAMarryMe/blog/595409 416 */ 417 } 418 419 420 //stack 练习堆栈.被称为是 专业程序员使用的数据结构 421 void StackTest() 422 { 423 stack<int, deque<int>> a; 424 stack<int, vector<int>> b; 425 stack<int, list<int>> c; 426 stack<int> d; 427 428 d.push(25); 429 d.push(10); 430 d.push(1); 431 d.push(5); 432 433 cout << "一共有" << d.size() << "个数据" << endl; 434 435 int x = d.top();//只看栈顶个,不删除数据 436 d.pop();//删除栈顶 437 438 x = d.top(); 439 d.pop(); 440 441 x = d.top(); 442 443 cout << d.size(); 444 445 446 cout << "----------------------" << endl; 447 } 448 449 //队列 练习 450 void QueueTest() 451 { 452 //queue不能使用vector的哦,不方便两端操作 453 queue<int, deque<int>> a; 454 queue<int, list<int>> b; 455 456 queue<int> q;//默认是 deque<int> 457 458 //队尾插入数据 459 q.push(10); 460 q.push(5); 461 q.push(-1); 462 q.push(20); 463 464 cout << q.size() << endl; 465 466 cout << "队首数据,但是不删除" << q.front() << endl; 467 cout << "队尾数据,但是不删除" << q.back() << endl; 468 469 //队首删除 470 q.pop(); 471 cout << "队首数据,但是不删除" << q.front() << endl; 472 cout << "队尾数据,但是不删除" << q.back() << endl; 473 474 /* 475 循环通过 while(q.size() != 0) 或者 while(q.empty() == false) 476 477 stack和queue都没有迭代器,所以不能用Iter 478 因为stack和queue只允许操作2端的数据,不可以操作中间的数据,所以没有Iter 479 */ 480 } 481 482 483 //STL动态数组 deque 484 void DequeTest() 485 { 486 deque<int> a; 487 488 //从尾部插入 489 a.push_back(3); 490 a.push_back(4); 491 a.push_back(5); 492 493 //从前面插入 494 a.push_front(2); 495 a.push_front(1); 496 a.push_front(0); 497 498 for (size_t nCount = 0; nCount < a.size();++nCount) 499 { 500 cout << a[nCount] << ","; 501 } 502 503 504 cout << endl; 505 a.pop_front();//删除前面 506 a.pop_back();//删除后面 507 //for (auto Iter = a.begin(); a.begin() != a.end();++Iter) //这个地方报错.暂时不知道原因 508 //{ 509 // cout << *Iter << ","; 510 //} 511 512 } 513 int main() 514 { 515 516 517 518 519 /* 520 DequeTest(); 521 522 QueueTest(); 523 524 StackTest(); 525 526 ConstTest(); 527 528 CastPoint(); 529 530 TestObjectSize(); 531 532 error_msg({ 100, 200, 300 });//可变形参 列表 533 534 FuncValueAsLeft(); 535 536 int a = func();//返回函数内的局部变量引用 ... c++ primer认为这是错误的.....那我这里是不是代码写错了 537 538 AssertTest();// assert()函数类似 if()判断,false就弹出警告 539 540 CompilerTest();//log的辅助信息 541 542 show_Test(); 543 544 ForTest2() 545 546 ForRange(); 547 548 GetLineTest(); 549 550 StringVar(); 551 552 MoveIter(); 553 554 Iter1(); 555 556 ForExp1(); 557 558 BitTest(); 559 560 */ 561 562 563 564 cout << endl; 565 system("pause"); 566 return 0; 567 }