天天看點

c++字元串、向量和數組

前一段時間忙着趕項目進度,現在就接着之前學習的内容繼續學習。

1、c++的内置類型(數字和字元等),展現了大多數計算機硬體本身具備的能力。

2、位于頭檔案中的代碼一般不用using進行聲明,因為頭檔案的内容會拷貝到所有引用它的檔案中去。

3、關于直接初始化和拷貝初始化:

        拷貝初始化:使用等号進行初始化即為拷貝初始化,例如:string s5 = "everyone can be a better man ";

        直接初始化:不使用等号進行初始化即為直接初始化,例如:string s5("everyone can be a better man");

        建議使用的時候盡量使用直接初始化,因為拷貝初始化會建立一個臨時對象。

4、使用cin>>對string對象執行讀取操作時,會自動忽略遇到的空白(空格符、換行符、制表符)并從第一個真正的的字元開始讀起,直到遇見下一處空白。: 

//example 
 int main()
{
       string s;
       cin>>s;
       cout << s << endl  ;//如果程式輸入的是"hello word!"輸出為"hello"
      return 0;
}
           

5、使用getline讀取輸入:getline函數的參數是一個輸入流和一個string對象,函數從給定的輸入流中讀取内容直到遇到換行符為止。

int main()
{
   string line;
   while (getline(cin,line))
      cout << line << endl;
   return 0;
}
           

6、string::size_type類型:string對象包含的字元個數,他是一個無符号類型的值能夠存放下任何string對象的大小。

7、如果一條表達式中已經有在用.size()函數了,就不要使用int了。避免混用int和unsigned。

8、關于兩個string對象的對比:

  1.   如果兩個string對象的長度不同,而且較短的string對象的每個字元都與較長string對象對應位置的字元相同,那麼就說較短的string對象小于較長的對象。
  2. 如果兩個string對象對應位置的字元都不相同,則比較第一對相異字元。             

9、當把string對象和字元字面值混在一條語句中使用時,要確定+号的兩邊至少有一個是string對象。

10、cctypet頭檔案中用來處理string對象的方法:

c++字元串、向量和數組

11、c++在引用c中的頭檔案時将.h去掉,再在前面加上c。例如:ctype.h->cctype。

12、使用範圍for循環可以周遊string對象中的每一個元素。如果想改變string中的元素要把循環變量定義成引用類型。

//example
string str("some string");
for (auto c:str)
   cout << c << endl;
           

13、string對象可以使用下标運算符周遊其中的每一個元素[i],使用時務必確定下标的有效。

//使用下标周遊string對象中元素
string s("everyone can be a better one");
for(int i =0;i<(s.size()-1);i++)
{
   cout << s[i];//可以實作輸出string中的每一個元素
}
           

14、vector可以容納絕大多數類型的對象作為其元素,但是不能為引用(引用不是對象沒有配置設定記憶體)

15、c++提供的幾種初始化方式:

            (1)、拷貝初始化;(2)、類内初始化;(3)、清單初始化。

16、如果循環體内有向vector對象添加元素的語句,不能使用範圍for循環。

17、要使用vector的size_type,需首先定義它是由那種類型定義的。

//example
vector <int>::size_type;
           

18、有關數組:

               (1)數組的維數編譯的時候應該是一個常數,函數内部定義數組預設初始化會使他含有未定義的值。

               (2)初始化字元數組要考慮最有一個是'\0'

               (3)數組不支援用另外一個數組拷貝和指派

//關于複雜數組的聲明(從右向左結合)
int *ptrs[10];//一個包含10個整形指針的數組
int &refs[10];//錯誤:不存在包含引用的數組(因為引用不是對象)
int (*parray)[10]; //指向數組的指針
int (&refs)[10];//指向數組的引用
           

19、使用auto和decltype對數組操作傳回的對象不同。

int ia [] = {3,3,3,3,33};
auto ia2(ia) ; //傳回指向第一個元素的指針
decltype(ia) ia3;//傳回一個數組
           

20、數組的begin和end(基于c++11标準)

//基于c++11
int ia [] = {2,2,2,2,2};
int *beg = begin(ia);
int * end = end(ia);
           

21、隻要指針指向數組中的元素就可以執行下标運算通路元素,内置類型下标運算所用的索引值不是無符号類型的。

22、c風格字元串以'\0'結尾,使用數組時真正用的是指向數組首元素的的指針。

23、指針沒有定義加法運算,減法限于指向同一個數組

24、可以使用數組初始化vector

int int_arr[]={2,3,4,5,6,7};
vector<int>ivec(begin(int_arr),end(int_arr));
           

25、多元數組:

constexpr size_t rowCnt = 3, colCnt =4;
int ia[rowCnt][colCnt];
size_t cnt =0;
for (auto &row:ia)
    for(auto & col:row)
       {
           col = cnt;
           ++cnt;
       }
//使用範圍for循環處理多元數組時,除了最内層的循環外,替他循環的控制變量都應該是引用類型
           

26、緩沖區溢出:越界通路引起的錯誤。

繼續閱讀