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 }