【學習筆記】C/C++

1. C語言中的 scanf() 函數ios

該函數包含在頭文件 <stdio.h> 或者 <cstdio> (在C++中使用時)函數

函數的返回值指的是this

所輸入的數據與格式字符串匹配的次數。spa

意思就是該函數返回已成功賦值的數據項數,出錯時返回 EOF (End_of_File,是一個預約義常量,表示文件末尾,值爲-1)指針

簡單示例:code

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int a, b;
 6     int input = scanf("%d %d", &a, &b);
 7     printf("input = %d\n", input);
 8     
 9     return 0;
10 }

此時輸入 1 2 對象

獲得輸出 input = 2 blog

上述結果表示正確匹配,若出現錯誤,如輸入 1 a 作用域

第二個值匹配失敗,整型變量b沒法獲得字符‘a’,依舊是一個未賦值前不肯定的值,則此時輸出結果爲 input = 1 字符串

總之,咱們可經過函數scanf( )返回值,來檢測輸入格式的正確性。

2. C++類與對象

2.1 問題:咱們須要將一個類的全部實例都保存在一個容器中,同時又不須要類的使用者進行其餘的操做,該如何實現?

方法:在類中定義一個static類型的容器做爲類的成員變量,構造對象時將對象的地址添加到容器中,析構時再將其從容器中刪除。

 1 #include <iostream>
 2 #include <list>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 class MyClass {
 8 protected:
 9    int value_;
10 public:
11    static list<MyClass*> instances_;
12    MyClass(int val);
13   ~MyClass();
14    static void showList();
15 };
16 
17 list<MyClass*> MyClass::instances_;
18 
19 MyClass::MyClass(int val) {
20    instances_.push_back(this);
21    value_ = val;
22 }
23 
24 MyClass::~MyClass() {
25    list<MyClass*>::iterator p =
26       find(instances_.begin(), instances_.end(), this);
27    if (p != instances_.end())
28       instances_.erase(p);
29 }
30 
31 void MyClass::showList() {
32    for (list<MyClass*>::iterator p = instances_.begin();
33         p != instances_.end(); ++p)
34       cout << (*p)->value_ << endl;
35 }
36 
37 int main(int argc, char **argv) {
38    MyClass a(1);
39    MyClass b(10);
40    MyClass c(100);
41    MyClass::showList();    // 輸出的結果爲1,10,100
42    return 0;  
43 }

3. 生成隨機數序列

3.1 C語言中 rand() 函數用來產生隨機數,但這不是真正意義上的隨機數,是僞隨機數。

它是以一個數(一般稱爲種子)爲基準推算出來的一系列數,當這系列數很大時,就會服從正態公佈,從而至關於產生了隨機數。

當計算機正常開機後,這個種子的值是定了的,除非你破壞系統,才能改變這個種子的值。

C++提供了 std::srand() 函數,其原型是 void srand( int a) ,利用 srand((unsigned int) (time(NULL)) 是一種產生不可預見的隨機序列的方法,由於每一次運行程序的時間是不一樣的。

3.2 以當前時間爲參數重置隨機數種子

若是沒調用 srand() ,你會發現你每次運行程序, rand() 獲得的序列值是不變的,而後 srand 裏參數相同時 rand() 獲得的序列也將相同。

 std::srand(time(0)) 的做用就是讓獲得的序列看上去更貼近隨機的概念。

 

4. Lambda表達式

爲什麼使用 Lambda ?

4.1 距離

不少人認爲,讓定義位於使用的附近頗有用。這樣就無需翻閱不少源代碼,以瞭解函數。修改代碼也很簡單。

Lambda 表達式是不錯的選擇,而函數是很差的選擇,由於不能內部定義其餘函數,定義可能離使用的地方很遠。函數符是個不錯的選擇,能夠在函數內部定義類(包含函數符類)。

4.2 簡潔

函數符代碼要比l Lambda 代碼更加繁瑣,函數和 Lambda 的簡潔程度至關。

4.3 效率

三種方法相對效率取決於編譯器的內聯。函數指針阻止了內聯,由於編譯器傳統上不會內聯其餘地址被獲取的函數,由於函數地址的概念意味着非內聯函數。而函數符和 Lambda 一般不會阻止內聯。

4.4 功能

Lambda 表達式可訪問做用域內的任何動態變量,能夠採用取值、引用的形式進行捕獲。

 

未完待續...

相關文章
相關標籤/搜索