(2)c++學習筆記--字符串,向量和數組

string

  1. string.size()函數,返回值是自定義的size_type類型,它至少是unsigned,所以要注意與int用在一個表達式的時候。
  2. 字面值和string對象相加的時候,必須確保+號兩側至少有一個是string對象。
//這就是錯誤的,都是字面值
string str = "hello ," + "world!";

3 .c++版本的c標準庫頭文件,比如c中ctype.h,在c++中是cctype
4. 遍歷string

//將str小寫轉大寫,遍歷的同時要修改,必須用&
string str("hello, world!")
for(auto &c : str){
    c = toupper(c)
}

5 . string: 下標遍歷和迭代器遍歷

vector

  1. vector: 一個容器,裏面的對象類型一致。c++有類模板和函數模板,vector是類模板,模板本身不是類或函數,而是編譯器生成類或函數的說明。
  2. 不存在包含引用的vector,因爲引用不是對象。
  3. 初始化:
vector<int> v1{10}; //10個int,每個都爲0
vector<String> v2{10}; //因爲10是int,不是string,所以這裏會處理成(10)

4 . 添加元素:push_back(),有一點需要尤其注意,在c或者Java中創建對象時指定容量更好,但是c++中不是,爲了高效的添加元素,不指定容量更好,只有一種情況是例外,就是每個值都一樣。
5 . 不能再範圍內循環的時候改變vector的大小。

vector<int>::size_type //正確
vector::size_type     //錯誤 

6 . i++ 和 ++i: 如果不看返回值,意思是一樣的,如果有返回值:

int i = 3;
int a = ++i;   //b=4,i=4
int i = 3;
int b = i++;   //b=3,i=4

7 . 尾迭代器:begin和end,begin指向的是第一個元素的迭代器,但是end指向的是最後一個元素的下一個位置的迭代器,這個位置是一個標誌位,如果爲空,begin和end指向的一樣,都是尾迭代器。

vector<int> v;
auto it1 = v.begin();  //it1的類型是:vector<int>::iterator
auto it2 = v.end(); //it2的類型是:vector<int>::const_iterator
//如果對象只需要讀而無需寫的話,用const_iterator比較好,所以c++提供了cbegin()和cend(),無論vector對象是否是常量,都返回const_iterator

8 . 箭頭運算符 -> ,就是把解引用和成員訪問結合在一起了。

(*it).empty();   //it是一個迭代器,兩行代碼效果一樣
it.empty(); 

9 . difference_type: 兩個迭代器之間的距離。

iterator可以進行算術運算,所得到的的結果類型爲difference_type

數組

  1. 數組聲明時必須指明大小,數組中元素的個數也是數組類型的一部分,所以大小必須是一個常量表達式。
  2. 數組和vector,其元素必須是對象,所以也不能有引用數組。
  3. 數組類型必須給定,不允許用auto來推斷。
  4. 不允許使用數組爲其他數組賦值,也不能將一個數組的內容拷貝到另外一個數組。
int a[] = {1,2,3};
int b[] = a; //錯誤 , 不能用一個數組初始化另外一個數組
b = a; //錯誤,不能把一個數組直接賦值給另外一個數組

5 . 特殊的字符數組,如果用字面值初始化,會在後面加一個空字符。

char a[] = {'a' , 'b' ,'c'}; //大小爲3
char b[] = "abc"; //大小爲4,會在末尾加一個空字符

6 . 複雜的數組聲明

int *p[10]; //p是一個含有10int指針的數組。
int (*p)[10]; //p是一個指針,指向含有10int的數組的指針。
int (&p)[10]; //p是一個引用,引用的是含有10int的數組。
int *(&p)[10]; //p是一個引用,引用的含有10int指針的數組。

7 . 指針和數組:使用數組的時候編譯器默認會把它轉爲指針。

int a[] = {1,2,3,4,5};
int *p = a; //等價於int *p = &a[0];
++p;  //a[1];
int *p2 = p + 1;  //p2指向a[2];
int *begin = begin(a);  //獲取首指針和尾指針
int *end = end(a);

8 . ptrdiff_t, cstddef頭文件中定義,指針做運算操作的結果類型。
9 . 當指針執行下標運算的例子:

int a[] = {1,2,3,4,5};
int *p = &a[2];
int j = p[1]; // 相當於*(p+1),就是a[3];

10 . c中的string: c中string是用char[],c中並沒有字符串這種類型,只是一種約定俗成的寫法,字符串以空字符結束。

char a[] = {'a','b','c'};//a是一個字符數組,但是如果把它當成字符串來用,比如使用strlen函數的時候,就會出錯,因爲它不是以'\0'結尾的。
char b[] = "abc"; //這樣就沒問題,編譯器會默認加一個

11 . 字符串拼接

//c++中string標準庫

string result = str1 + " " + str2;

//c中最好使用strcpy和strcat函數,但是必須先定義好result數組,此時str1和str2都是char[]

char result[100];
strcpy(result , str1);
strcat(result , " ");
strcat(result , str2);

12 . c和c++字符串互相轉換

char aaaa[] = {'a' , 'b' ,'c' , '\0'};
    string str(aaaa);
    char bbb[5];
    strcpy(bbb , str.c_str());

13 . 在使用範圍內for循環的時候,除了最內層的循環外,其他所有循環控制變量都應該是引用類型。
14 . 在使用多維數組的時候也要注意,也會將其轉換爲指向首位元素的指針。
15 . tips,使用類型別名命名數組,能讓程序更簡潔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章