C++primer 第 3 章 字符串、向量和數組 3 . 5 數組

3.5數組

  • 數組是一種類似于標準庫類型vector(參見3.3節,第86頁)的數據結構,但是在性能和靈活性的權衡上又與vector有所不同。與vector相似的地方是,數組也是存放類型相同的對象的容器,這些對象本身沒有名字,需要通過其所在位置訪問。與vector不同的地方是,數組的大小確定不變,不能隨意向數組中增加元素。因為數組的大小固定,
  • 因此對某些特殊的應用來說程序的運行時性能較好,但是相應地也損失了一些靈活性。
  • 如果不清楚元素的確切個藪,請使用vector

3.5.1定義和初始化內置數組

  • 數組是一種復合類型(參見2.3節,第45頁)。數組的聲明形如a[d],其中a是數組的名字,d是數組的維度。維度說明了數組中元素的個數,因此必須大于0。數組中元素的個數也屬于數組類型的一部分,編譯的時候維度應該是已知的。也就是說,維度必須是一個常量表達式(參見2.4.4節,第58頁):

  • 和內置類型的變量一樣,如果在函數內部定義了某種內置類型的數組,那么默認初始化會令數組含有未定義的值,
  • 定義數組的時候必須指定數組的類型,不允許用auto。關鍵字由初始值的列表推斷類型。另外和vector一樣,數組的元素應為對象,因此不存在引用的數組

顯式初始化數組元素

  • 可以對數組的元素進行列表初始化(參見3.3.1節,第88頁),此時允許忽略數組的維度。如果在聲明時沒有指明維度,編譯器會根據初始值的數量計算并推測出來;相反,如果指明了維度,那么初始值的總數量不應該超出指定的大小。如果維度比提供的初始值數量大,則用提供的初始值初始化靠前的元素,剩下的元素被初始化成默認值(參見3.3.1節,第88頁):

字符數組的特殊性

  • 字符數組有一種額外的初始化形式,我們可以用字符串字面值(參見2.1.3節,第36頁)對此類數組初始化。當使用這種方式時,一定要注意字符串字面值的結尾處還有一個空字符,這個空字符也會像字符串的其他字符一樣被拷貝到字符數組中去:

  • al的維度是3,a2和a3的維度都是4,a4的定義是錯誤的。盡管字符串字面值"Daniel1看起來只有6個字符,但是數組的大小必須至少是7,其中6個位置存放字面值的內容,另外1個存放結尾處的空字符。

理解復雜的數組聲明

  • 和vector-樣,數組能存放大多數類型的對象。例如,可以定義一個存放指針的數組。又因為數組本身就是對象,所以允許定義數組的指針及數組的引用。在這幾種情況中,定義存放指針的數組比較簡單和直接,但是定義數組的指針或數組的引用就稍微復雜一點了:

  • 默認情況下,類型修飾符從右向左依次綁定。對于Ptrs來說,從右向左(參見2.3.3節,第52頁)理解其含義比較簡單:首先知道我們定義的是一個大小為10的數組,它的名字是ptrs,然后知道數組中存放的是指向int的指針。但是對于Parray來說,從右向左理解就不太合理了。因為數組的維度是緊跟著被聲明的名字的,所以就數組而言,由內向外閱讀要比從右向左好多了。由內向外的順序可幫助我們更好地理解Parray的含義:首先是圓括號括起來的部分,*Parray意味著Parray是個指針,接下來觀察右邊,可知道Parray是個指向大小為10的數組的指針,最后觀察左邊,知道數組中的元素是int。這樣最終的含義就明白無誤了,Parray是一個指針,它指向一個int數組,數組中包含10個元素。同S,(&arrRef)表示arrRef是一個引用,它引用的對象是一個大小為10的數組,數組中元素的類型是int。當然,對修飾符的數量并沒有特殊限制:
  • in t * (&arry) [10] = p tr s ; / / a r r y 是數組的引用,該 數 組含有 1 0 個指針
  • 按照由內向外的順序閱讀上述語句,首先知道arry是一個引用,然后觀察右邊知道,arry引用的對象是一個大小為10的數組,最后觀察左邊知道,數組的元素類型是指向int的指針。這樣,arry就是一個含有10個int型指針的數組的引用
  • 要想理解數組聲明的含義,最好的辦法是從數組的名字開始按照由內向外的順序閱讀"

3 .5 .2 訪問數組元素

  • 與標準庫類型vector和string一樣,數組的元素也能使用范圍for語句或下標運算符來訪問。數組的索引從0開始,以一個包含10個元素的數組為例,它的索引從0到9,而非從1到10。
  • 在使用數組下標的時候,通常將其定義為size_t類型。size_t是一種機器相關的無符號類型,它被設計得足夠大以便能表示內存中任意對象的大小。在cstdef頭文件中定義了sizet類型,這個文件是C標準庫stddef.h頭文件的C++語言版本。

?

3 .5 .3 指針和數組

  • 在C++語言中,指針和數組有非常緊密的聯系。就如即將介紹的,使用數組的時候編譯器一般會把它轉換成指針。
  • 通常情況下,使用取地址符(參見2.3.2節,第47頁)來獲取指向某個對象的指針,取地址符可以用于任何對象。數組的元素也是對象,對數組使用下標運算符得到該數組指定位置的元素。因此像其他對象一樣,對數組的元素使用取地址符就能得到指向該元素的指針:
  • string nums [] = {"one”, "two", *'threen ; // 數組的元素是 string 對象
  • string *p = &nums [0] ; // p 指向 nums 的第一個元素
  • 然而,數組還有一個特性:在很多用到數組名字的地方,編譯器都會自動地將其替換為一個指向數組首元素的指針:
  • string *p2 = nums; // 等價于 p2 = &nums [0]
  • 在大多數表達式中,使用數組類型的對象其實是使用一個指向該數組首元素的指針。
  • 由上可知,在一些情況下數組的操作實際上是指針的操作,這一結論有很多隱含的意思。其中一層意思是當使用數組作為一個auto (參見2.5.2節,第 61頁)變量的初始值 時,推斷得到的類型是指針而非數組:

指針也是迭代器

  • 與2.3.2節(第47頁)介紹的內容相比,指向數組元素的指針擁有更多功能。vector和string的迭代器(參見3.4節,第95頁)支持的運算,數組的指針全都支持。例如,允許使用遞增運算符將指向數組元素的指針向前移動到下一個位置上:
  • int arr[] = 10,1,2,3,4,5,6,7,8,9};
  • int *p = arr; // p 指 向 arr的第一個元素
  • ++p; // p 指向 arr [1]
  • 就像使用迭代器遍歷vector對象中的元素一樣,使用指針也能遍歷數組中的元素。當然,這樣做的前提是先得獲取到指向數組第一個元素的指針和指向數組尾元素的下一位置的指針。之前已經介紹過,通過數組名字或者數組中首元素的地址都能得到指向首元素的指針;不過獲取尾后指針就要用到數組的另外一個特殊性質了。我們可以設法獲取數組尾元素之后的那個并不存在的元素的地址:
  • in t *e = &arr [10] ; / / 指向a r r 尾元素的下一位置的指針
  • 這里顯然使用下標運算符索引了一個不存在的元素,arr有 10個元素,尾元素所在位置的索引是9 , 接下來那個不存在的元素唯一的用處就是提供其地址用于初始化e , 就像尾后迭代器(參見3.4.1節,第 95頁)一樣,尾后指針也不指向具體的元素。因此,不能對尾后指針執行解引用或遞增的操作。利用上面得到的指針能重寫之前的循環,令其輸出arr的全部元素:
  • for ( int *b = arr ; b != e ; ++b)
    cout ? *b ? endl; // 輸出 arr 的元素

標準庫函數begin和end

  • 盡管能計算得到尾后指針,但這種用法極易出錯。為了讓指針的使用更簡單、更安全,C++11新標準引入了兩個名為begin和end的函數。這兩個函數與容器中的兩個同名成員(參見3.4.1節,第95頁)功能類似,不過數組畢竟不是類類型,因此這兩個函數不是成員函數。正確的使用形式是將數組作為它們的參數:

  • begin函數返回指向ia首元素的指針,end函數返回指向ia尾元素下一位置的指針,這兩個函數定義在iterator頭文件中。使用begin和end可以很容易地寫出一個循環并處理數組中的元素。例如,假設arr是一個整型數組,下面的程序負責找到arr中的第一個負數

  • 首先定義了兩個名為pbeg和pend的整型指針,其中pbeg指向arr的第一個元素,pend指向arr尾元素的下一位置。while語句的條件部分通過比較pbeg和pend來確保可以安全地對pbeg解引用,如果pbeg確實指向了一個元素,將其解引用并檢查元素值是否為負值。如果是,條件失效、退出循環;如果不是,將指針向前移動一位繼續考查下一個元素。
  • 一個指針如果指向了某種內置類型數組的尾元素的“下一位置”,則其具備與ivector的end函數返回的與迭代器類似的功能。特別要注意,尾后指針不能執行解引用和遞增操作,"

指針運算

  • 指向數組元素的指針可以執行表3.6 (第96頁 )和 表 3.7 (第 99頁)列出的所有迭代器運算。這些運算,包括解引用、遞增、比較、與整數相加、兩個指針相減等,用在指針和用在迭代器上意義完全一致。給(從)一個指針加上(減去)某整數值,結果仍是指針。新指針指向的元素與原來的指針相比前進了(后退了)該整數值個位置

  • ip加上4所得的結果仍是一個指針,該指針所指的元素與ip原來所指的元素相比前進了 4個位置。給指針加上一個整數,得到的新指針仍需指向同一數組的其他元素,或者指向同一數組的尾元素的下一位置:
  • / / 正確:arr轉換成指向它首元素的指針;p 指向arr尾元素的下一位置
  • int *p = arr + sz; / / 使用警告:不要解引用!
  • int *p2 = arr + 10; / / 錯誤:arr只 有 5 個元素,p2的值未定義
  • 當給arr加上sz時,編譯器自動地將arr轉換成指向數組arr中首元素的指針。執行加法后,指針從首元素開始向前移動了sz(這里是5)個位置,指向新位置的元素。也就是說,它指向了數組arr尾元素的下一位置。如果計算所得的指針超出了上述范圍就將產生錯誤,而且這種錯誤編譯器一般發現不了。
  • 和迭代器一樣,兩個指針相減的結果是它們之間的距離。參與運算的兩個指針必須指向同一個數組當中的元素:
  • auto n=end(arr)-begin(arr);//n的值是5,也就是arr中元素的數量
  • 兩個指針相減的結果的類型是一種名為ptrdiff_t的標準庫類型,和size_t一樣,ptrdiff_t也是一種定義在cstddef頭文件中的機器相關的類型。因為差值可能為負值,所以ptrdiff_t是一種帶符號類型。只要兩個指針指向同一個數組的元素,或者指向該數組的尾元素的下一位置,就能利用關系運算符對其進行比較。例如,可以按照如下的方式遍歷數組中的元素:

  • 盡管作用可能不是特別明顯,但必須說明的是,上述指針運算同樣適用于空指針(參見2.3.2節,第48頁)和所指對象并非數組的指針。在后一種情況下,兩個指針必須指向同一個對象或該對象的下一位置。如果p是空指針,允許給p加上或減去一個值為0的整型常量表達式(參見2.4.4節,第58頁)。兩個空指針也允許彼此相減,結果當然是0。

解引用和指針運算的交互

  • 指針加上一個整數所得的結果還是一個指針。假設結果指針指向了一個元素,則允許解引用該結果指針:
  • int ia[] = (0,2,4,6,8}; / / 含 有 5個整數的數組
  • int last = * (ia + 4 ); / / 正確:把 last初始化成8,也 就 是 ia [4]的值
  • 表達式*(ia+4)計算ia前進4個元素后的新地址,解引用該結果指針的效果等價于表達式 ia[4]
  • 回憶一下在3.4.1節 (第98頁)中介紹過如果表達式含有解引用運算符和點運算符,最好在必要的地方加上圓括號。類似的,此例中指針加法的圓括號也不可缺少。如果寫成下面的形式:last = *ia + 4; // 正確: last =4 等價于 ia [0] + 4含義就與之前完全不同了,此時先解引用ia,然后給解引用的結果再加上4。4.1.2節 (第 121頁)將對這一問題做進一步分析。

  • 雖然標準庫類型string和vector也能執行下標運算,但是數組與它們相比還是有所不同。標準庫類型限定使用的下標必須是無符號類型,而內置的下標運算無此要求,上面的最后一個例子很好地說明了這一點。內置的下標運算符可以處理負值,當然,結果地址必須指向原來的指針所指同一數組中的元素(或是同一數組尾元素的下一位置)。
  • 內置的下標運算符所用的索引值不是無符號類型,這一點與vector和string 不一樣。

3.5.4 C 風格字符串

  • 字符串字面值是一種通用結構的實例,這種結構即是C++由C繼承而來的C風格字符串(C-stylecharacterstring)oC風格字符串不是一種類型,而是為了表達和使用字符串而形成的一種約定俗成的寫法。按此習慣書寫的字符串存放在字符數組中并以空字符結束。以空字符結束的意思是在字符串最后一個字符后面跟著一個空字符。一般利用指針來操作這些字符串。

C標準庫String函數

  • 表 3.8列舉了 C 語言標準庫提供的一組函數,這些函數可用于操作C 風格字符串,它們定義在cstring頭文件中,cstring是 C 語言頭文件string.h 的 C++版本

  • 表 3.8所列的函數不負責驗證其字符串參數:
  • 傳入此類函數的指針必須指向以空字符作為結束的數組:不遇到 '\0' 不結束

比較字符串

  • 比較兩個C風格字符串的方法和之前學習過的比較標準庫string對象的方法大相徑庭。比較標準庫string對象的時候,用的是普通的關系運算符和相等性運算符:

  • 謹記之前介紹過的,當使用數組的時候其實真正用的是指向數組首元素的指針(參見3.5.3節,第 105頁)。因此,上面的if 條件實際上比較的是兩個const char*的值。這兩個指針指向的并非同一對象,所以將得到未定義的結果。
  • 比較兩個C風格字符串需要調用strcmp函數,此時比較的就不再是指針了。如果兩個字符串相等,strcmp返回0;如果前面的字符串較大,返回正值;如果后面的字符串較大,返回負值:
  • if (strcmp (cal, ca2) < 0) // 和兩個 string 對象的比較 si < s2 效果一樣

  • -個潛在的問題是,我們在估算largeStr所需的空間時不容易估準,而且largeStr所存的內容一旦改變,就必須重新檢查其空間是否足夠。不幸的是,這樣的代碼到處都是,程序員根本沒法照顧周全。這類代碼充滿了風險而且經常導致嚴重的安全泄漏。
  • 對大多數應用來說,使用標準庫string要比使用C 風格字符串更安全、更高效

3.5.5與舊代碼的接口

  • 很多C++程序在標準庫出現之前就已經寫成了,它們肯定沒用到string和vector類型。而且,有一些C程序實際上是與C語言或其他語言的接口程序,當然也無法使用C++標準庫。因此,現代的C++程序不得不與那些充滿了數組和/或C風格字符串的代碼銜接,為了使這一工作簡單易行,C++專門提供了一組功能。

混用string對象和C風格字符串

  • 3.2.1節(第76頁)介紹過允許使用字符串字面值來初始化string對象
  • string s ("Hello World") ; // s 的內容是 Hello World
  • 更一般的情況是,任何出現字符串字面值的地方都可以用以空字符結束的字符數組來替代:
  • 允許使用以空字符結束的字符數組來初始化string對象或為string對象賦值。
  • 在string對象的加法運算中允許使用以空字符結束的字符數組作為其中一個運算對象(不能兩個運算對象都是);在string對象的復合賦值運算中允許使用以空字符結束的字符數組作為右側的運算對象。
  • 上述性質反過來就不成立了:如果程序的某處需要一個C風格字符串,無法直接用string對象來代替它。例如,不能用string對象直接初始化指向字符的指針。為了完成該功能,string專門提供了一個名為c_str的成員函數:
  • char* str=s;//錯誤:不能用string對象初始化char*
  • const char* str=s.cstr();//正確?
  • 顧名思義,c_str函數的返回值是一個C風格的字符串。也就是說,函數的返回結果是一個指針,該指針指向一個以空字符結束的字符數組,而這個數組所存的數據恰好與那個string對象的一樣。結果指針的類型是const char*,從而確保我們不會改變字符數組的內容。
  • 我們無法保證c_str函數返回的數組一直有效,事實上,如果后續的操作改變了 s 的值就可能讓之前返向的數組失去效用。
  • 如果執行完c_str ()函數后程序想一直都能使用其返回的數組,最好將該數 組重新拷貝一份

使用數組初始化vector對象

  • 3.5.1節(第102頁)介紹過不允許使用一個數組為另一個內置類型的數組賦初值,也不允許使用vector對象初始化數組。相反的,允許使用數組來初始化vector對象。要實現這一目的,只需指明要拷貝區域的首元素地址和尾后地址就可以了:

  • 在上述代碼中,用于創建ivec的兩個指針實際上指明了用來初始化的值在數組int_arr中的位置,其中第二個指針應指向待拷貝區域尾元素的下一位置。此例中,使用標準庫函數begin和end(參見3.5.3節,第106頁)來分別計算int_arr的首指針和尾后指針。在最終的結果中,ivec將包含6個元素,它們的次序和值與數組int arr完全相同

3.6多維數組

  • 嚴格來說,C++語言中沒有多維數組,通常所說的多維數組其實是數組的數組。謹記這一點,對今后理解和使用多維數組大有益處。當一個數組的元素仍然是數組時,通常使用兩個維度來定義它:一個維度表示數組本身大小,另外-個維度表示其元素(也是數組)大小:

  • 如3.5.1節(第103頁)所介紹的,按照由內而外的順序閱讀此類定義有助于更好地理解其真實含義。在第一條語句中,我們定義的名字是ia,顯然ia是一個含有3個元素的數組。接著觀察右邊發現,ia的元素也有自己的維度,所以ia的元素本身又都是含有4個元素的數組。再觀察左邊知道,真正存儲的元素是整數。因此最后可以明確第一條語句的含義:它定義了一個大小為3的數組,該數組的每個元素都是含有4個整數的數組。
  • 使用同樣的方式理解arr的定義。首先arr是一個大小為10的數組,它的每個元素都是大小為20的數組,這些數組的元素又都是含有30個整數的數組。實際上,定義數組時對下標運算符的數量并沒有限制,因此只要愿意就可以定義這樣一個數組:它的元素還是數組,下一級數組的元素還是數組,再下一級數組的元素還是數組,以此類推。
  • 對于二維數組來說,常把第一個維度稱作行,第二個維度稱作列。

多維數組的下標引用

  • 可以使用下標運算符來訪問多維數組的元素,此時數組的每個維度對應一個下標運算符。如果表達式含有的下標運算符數量和數組的維度一樣多,該表達式的結果將是給定類型的元素;反之,如果表達式含有的下標運算符數量比數組的維度小,則表達式的結果將是給定索引處的一個內層數組:

  • 在第一個例子中,對于用到的兩個數組來說,表達式提供的下標運算符數量都和它們各自的維度相同。在等號左側,ia[2]得到數組ia的最后一行,此時返回的是表示ia最后一行的那個一維數組而非任何實際元素;對這個一維數組再取下標,得到編號為[3]的元素,也就是這一行的最后一個元素。類似的,等號右側的運算對象包含3個維度。首先通過索引0得到最外層的數組,它是一個大小為20的(多維)數組;接著獲取這20個元素數組的第一個元素,得到一個大小為30的一維數組;最后再取出其中的第一個元素。
  • 在第二個例子中,把row定義成一個含有4個整數的數組的引用,然后將其綁定到ia的第2行。
  • 再舉一個例子,程序中經常會用到兩層嵌套的for循環來處理多維數組的元素:
  • constexpr size_t rowCnt = 3, colCnt = 4;

  • 外層的for循環遍歷ia的所有元素,注意這里的元素是一維數組:內層的for循環則遍歷那些一維數組的整數元素。此例中,我們將元素的值設為該元素在整個數組中的序號。

指針和多維數組

  • 當程序使用多維數組的名字時,也會自動將其轉換成指向數組首元素的指針。
  • 定義指向多維數蛆的指針時,千萬別忘了這個多維數組實際上是數組的數組
  • 因為多維數組實際上是數組的數組,所以由多維數組名轉換得來的指針實際上是指向第一個內層數組的指針:

  • 根據3.5.1節 (第 103頁)提出的策略,我們首先明確(*p)意味著p 是一個指針。接著觀 察右邊發現,指針P 所指的是一個維度為4 的數組;再觀察左邊知道,數組中的元素是整數。因此,p 就是指向含有4個整數的數組的指針。

  • 外層的for循環首先聲明一個指針p并令其指向ia的第一個內層數組,然后依次迭代直到ia的全部3行都處理完為止。其中遞增運算++p負責將指針p移動到ia的下一行。內層的for循環負責輸出內層數組所包含的值。它首先令指針q指向p當前所在行的第一個元素。*p是一個含有4個整數的數組,像往常一樣,數組名被自動地轉換成指向該數組首元素的指針。內層for循環不斷迭代直到我們處理完了當前內層數組的所有元素為止。為了獲取內層for循環的終止條件,再一次解引用p得到指向內層數組首元素的指針,給它加上4就得到了終止條件。
  • 當然,使用標準庫函數begin和end(參見3.5.3節,第106頁)也能實現同樣的功能,而且看起來更簡潔一些:

  • 在這一版本的程序中,循環終止條件由end函數負責判斷。雖然我們也能推斷出p的類型是指向含有4個整數的數組的指針,q的類型是指向整數的指針,但是使用auto。關鍵字我們就不必再煩心這些類型到底是什么了

小結

  • string和vector是兩種最重要的標準庫類型。string對象是一個可變長的字符序列,vector對象是一組同類型對象的容器。迭代器允許對容器中的對象進行間接訪問,對于string對象和vector對象來說,可以通過迭代器訪問元素或者在元素間移動。
  • 數組和指向數組元素的指針在一個較低的層次上實現了與標準庫類型string和vector類似的功能。一般來說,應該優先選用標準庫提供的類型,之后再考慮C++語言內置的低層的替代品數組或指針。

術語表

  • begin是string和vector的成員,返回指向第一個元素的迭代器。也是一個標準庫函數,輸入一個數組,返回指向該數組首元素的指針。
  • 緩沖區溢出(bufferoverflow)一種嚴重的程序故障,主要的原因是試圖通過一個越界的索引訪問容器內容,容器類型包括string、vector和數組等。
  • C風格字符串(C-stylestring)以空字符結束的字符數組。字符串字面值是C風格字符串,C風格字符串容易出錯。
  • 類模板用于創建具體類類型的模板。要想使用類模板,必須提供關于類型的輔助信息。例如,要定義一個vector對象需要指定元素的類型:vector<int>包含int類型的元素。
  • 編譯器擴展(compilerextension)某個特定的編譯器為C++語言額外增加的特性。基于編譯器擴展編寫的程序不易移植到其他編譯器上。
  • 容器(container)是一種類型,其對象容納了一組給定類型的對象。vector是一種容器類型。
  • 拷貝初始化(copyinitialization)使用賦值號(=)的初始化形式。新創建的對象是初始值的一個副本
  • difference_type由string和vector定義的一種帶符號整數類型,表示兩個迭代器之間的距離。
  • 直接初始化(directinitialization)不使用賦值號(=)的初始化形式。
  • empty是string和vector的成員,返回一個布爾值。當對象的大小為0時返回真,否則返回假.
  • end是string和vector的成員,返回一個尾后迭代器。也是一個標準庫函數,輸入一個數組,返回指向該數組尾元素的下-位置的指針。
  • getline在string頭文件中定義的一個函數,以一個istream對象利--個string對象為輸入參數。該函數首先讀取輸入流的內容直到遇到換行符停止,然后將讀入的數據存入string對象,最后返回istream對象。其中換行符讀入但是不保留。
  • 索引(index)是下標運算符使用的值。表示要在string對象、vector對象或者數組中訪問的一個位置。
  • 實例化(instantiation)編譯器生成一個指定的模板類或函數的過程。
  • 迭代器(iterator)是一種類型,用于訪問容器中的元素或者在元素之間移動。
  • 迭代器運算(iteratorarithmetic)是string或vector的迭代器的運算:迭代器與整數相加或相減得到一個新的迭代器,與原來的迭代器相比,新迭代器向前或向后移動了若干個位置。兩個迭代器相減得到它們之間的距離,此時它們必須指向同一個容器的元素或該容器尾元素的下一位置。
  • 以空字符結束的字符串(null-terminatedstring)是一個字符串,它的最后一個字符后而還跟著一個空字符("\0")。
  • 尾后迭代器(off-the-enditerator)end函數返I可的迭代器,指向一個并不存在的元素,該元素位于容器尾元素的下一位置。
  • 指針運算(pointerarithmetic)是指針類型支持的算術運算。指向數組的指針所支持的運算種類與迭代器近算一樣。
  • prtdiff_t是cstddef頭文件中定義的一種與機器實現有關的帶符號整數類型,它的空間足夠大,能夠表示數組中任意兩個指針之間的距離。
  • pushback是vector的成員,向vector對象的木尾添加元素。
  • 范圍for語句(rangefor)-種控制語句,可以在值的一個特定集合內迭代。
  • size是string和vector的成員,分別返回字符的數量或元素的數量。返回值的類型是size_type。size_t是cstddef頭文件中定義的一種與機器實現有關的無符號整數類型,它的空間足夠大,能夠表示任意數組的大小。
  • size_type是string和vector定義的類型的名字,能存放下任意string對象或vector對象的大小。在標準中,size_type被定義為無符號類型。string是一種標準庫類型,表示字符的序列。
  • using聲明(usingdeclaration)令命名空間中的某個名字可被程序直接使用。using命名空間::名字;L述語句的作用是令程序可以直接使用名字,而無須寫它的前綴部分命名空間
  • 值初始化(valueinitialization)是一種初始化過程。內置類型初始化為0,類類型由類的默認構造函數初始化。只有當類包含默認構造函數時,該類的對象才會被值初始化。對于容器的初始化來說,如果只說明了容器的大小而沒有指定初始值的話,就會執行值初始化。此時編譯器會生成一個值,而容器的元素被初始化為該值。
  • vector是-種標準庫類型,容納某指定類型的一組元素。
  • ++運算符(++operator)是迭代器和指針定義的遞增運算符。執行“加1”操作使得迭代器指向下一個元素
  • []運算符([]operator)下標運算符Oobj[j]得到容器對象。bj中位置j的那個元素。索引從0開始,第一個元素的索引是0,
  • 尾元素的索引是。bj.size()-1.下'標運算符的返回值是一個對象。如果p是指針、n是整數,則p[n]與*(p+n)等價。->運算符(->operator)箭頭運算符,該運算符綜合了解引用操作和點操作.a->b等價于(*a).b。
  • <<運算符(《operator)標準庫類型string定義的輸出運算符,負責輸出string對象中的字符。
  • >>運算符(>>operator)標準庫類型string定義的輸入運算符,負責讀入一組字符,遇到空白停止,讀入的內容賦給運算符右側的運算對象,該運算對象應該是一個string對象。
  • !運算符^operator)邏輯非運算符,將它的運算對象的布爾值取反。如果運算對象是假,則結果為真,如果運算對象是真:,則結果為假。
  • &&運算符(&&operator)邏輯與運算符,如果兩個運算對象都是真,結果為真。只有當左側運算對象為真時才會檢查右側運算對象。
  • II運算符(||operator)邏輯或運算符,任何一個運算對象是真,結果就為真。只有里左側運算對象為假時才會檢查右側運算對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446661.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446661.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

codeforces 122A-C語言解題報告

122A題目網址 題目解析 1.輸入數字(在1000以內),若能被4,7幸運數整除或只含4,7則輸出YES,否則輸出NO 舉例: 輸入: 107 輸出: NO 2.解題關鍵: 1)使用列舉法,把所有符合的幸運數列出來(int number[]) 1—2 2–224 3–22*28 24814個 2)若n是幸運數中的一個或n%幸運數0,則為YES…

SpringBoot @Value給靜態變量注入值

文章目錄一、簡介二、Value給靜態變量注入值方案一&#xff1a;set()方法設置方案二&#xff1a;PostConstruct注解修飾的方法中進行賦值三、總結一、簡介 SpringBoot 中給普通變量注入值只需在變量上添加 Value 注解即可。 application.properties 配置文件有如下配置&#…

C++primer 第 4 章 表達式 4.1基礎 4 . 2 算術運算符 4 .3 邏輯和關系運算符 4 . 4 賦值運算符 4 .5 遞增和遞減運算符 4.6成員訪問運算符

表達式由一個或多個運算對象(operand)組成&#xff0c;對表達式求值將得到一個結果(result)字面值和變量是最簡單的表達式(expression),其結果就是字面值和變量的值。把一個運算符(operator)和一個或多個運算對象組合起來可以生成較復雜的表達式 4.1基礎 有幾個基礎概念對表達…

codeforces 266B-C語言解題報告

266B題目網址 題目解析 輸入n,t,排隊情況s,輸出第t次循環后,排隊情況 舉例: 輸入: 5 1 BGGBG 輸出: GBGGB 2.輸入的n代表排隊的人數,t代表整個循環t次之后再輸出結果 3.注意點: 使用while()大循環去控制t次的循環,使用for()內層循環去遍歷整個字符串 如果if(s[j]‘B’&…

Nginx Location配置詳解

目錄一、語法二、匹配順序三、root 與 alias 的區別四、server 和 location 中的 root一、語法 Location 是 Nginx 中一個非常核心的配置&#xff0c;關于Location&#xff0c;舉個簡單的配置例子&#xff1a; server {listen 80;server_name 10.0.7.115;location / {root /d…

英語口語-文章朗讀Week9 Wednesday

英語文章 Birds of the same species flock together&#xff0c; People tend to look for someone like themselves to be friends. But having the same interests is not the only standard when we are seeking friends. In most cases, especially for adults, people l…

C++primer 第 4 章 表達式 4.7條件運算符 4.8位運算符 4.9 sizeof運算符 4.10逗號運算符 4.11類型轉換 4 . 1 2 運算符優先級表

4.7條件運算符 條件運算符(?&#xff1a;)允許我們把簡單的if else邏輯嵌入到單個表達式當中&#xff0c;條件運算符按照如下形式使用&#xff1a;cond ? expr1 : expr2;其中cond是判斷條件的表達式&#xff0c;而expr1和expr2是兩個類型相同或可能轉換為某個公共類型的表達…

Git 之 git tag標簽使用

目錄一、簡介二、本地tag操作1、創建tag標簽&#xff08;1&#xff09;創建輕量標簽&#xff08;2&#xff09;創建附注標簽2、查看tag標簽&#xff08;1&#xff09;查看標簽列表&#xff08;2&#xff09;查看標簽提交信息&#xff08;3&#xff09;在提交歷史中查看標簽3、刪…

codeforces 110A-C語言解題報告

110A題目網址 題目解析 1.輸入一個數字,如果數字中包含的4,7的數量是4或7的倍數,則輸出YES,否則輸出NO 舉例: 輸入: 40047 輸出: NO 2.注意點: 1)由于數字很長,所以使用long long int類型,使用scanf("%lld",&n)接收輸入 2)整型轉字符串,使用sprintf(字符串,“…

C++primer 第 5 章語句 5.2語句作用域 5.3條件語句 5 . 4 迭代語句 5.5跳轉語句 5.6 try語句塊和異常處理

5 . 1 簡單語句 C語言中的大多數語句都以分號結束&#xff0c;一個表達式&#xff0c;比如ival 5 , 末尾加上分號就變成了表達式語句(expression statement)。表達式語句的作用是執行表達式并丟棄掉求值結果&#xff1a;ival 5&#xff1b; // 一條沒什么實際用處的表達式語…

英語口語-文章朗讀Week9Thursday

英語文章 Everyone has his or her own dreams. Some people wants to be millionaires so they can give many generous donations later; some people want to be scientists so they can bring many conveniences to the world; some people only want to be bus-drivers s…

操作系統 內存管理相關知識

cpu執行程序的基本過程 譯碼器 輸入為n管腳&#xff0c;輸出為2^n根管腳&#xff0c;編號為從0到2^(n-1)&#xff0c;用少的輸入端控制更多的輸出端最常用的是三八譯碼器AD(Address bus)地址總線: 選中一行數據每一行 8bit 組成8吧B cpu輸入端32根線&#xff0c;輸出端就可以控…

2000年考研英語閱讀理解文章四

文章詳細解析網址 注意點 1.注意But,however等表示觀點看法轉折的詞語 2.全篇都在提及moral decline 道德下降,最后一段寫that may have more to do with life-style所以造成現象的原因應該是life-style.(主要) 前面都是在分析,最后一段點名原因 知識點 ----單詞 envy n/v…

Chrome瀏覽器必裝插件!尤其程序猿!

Chrome 瀏覽器有一個好處&#xff0c;就是插件極其豐富&#xff0c;只有你想不到的&#xff0c;沒有你找不到的&#xff0c;這恐怕是 Chrome 瀏覽器被眾多愛好者鐘愛的原因吧。 言歸正傳&#xff0c;今天來給大家推薦 10 款我自己珍藏的 Chrome 瀏覽器插件。 1、crxMouse Ch…

codeforces 160A-C語言解題報告

160A題目網址 題目解析 1.輸入硬幣的個數,分配硬幣,使拿最小的硬幣數比剩下的硬幣金額大 舉例: 輸入: 2 3 3 輸出 2 2.注意點: 1)接收整型數組時要使用&,因為只有字符數組是使用指針傳遞首地址的 scanf("%d",&a[i]); 2)使用冒泡排序,將數組從大到小排序…

英語口語-文章朗讀Week10 Monday

英語文章 Here are some valuable suggestions which may assist you in landing good job First, make your resume clear and associate it with the position you are applying for. Try to add details like your temporary jobs at college or your former jobs Second, …

論文遇到的格式問題和修正方式

word空格出現小圓點怎么辦論文參考文獻批量改為上角標&#xff0c;簡單好用&#xff01;&#xff01;&#xff01;字數統計網站word封面下劃線怎么對齊&#xff08;非常簡單徹底解決&#xff09;

codeforces 41A-C語言解題報告

41A題目網址 題目解析 1.輸入一個字符串,如果第二行是倒序輸入這個字符串的,就輸出YES,否則輸出NO 舉例: 輸入: abb aba 輸出: NO 2.倒序輸出時,使用int jstrlen(t)-1;,因為strlen()是計算字符個數,而字符串是從0開始,最后一位是字符串長度減一 3.在接收第二個字符串輸入時…

Linux查看文件的首個字母 文件屬性字段

-rw-r–r– 1 root root 762 07-29 18:19 exit文件屬性字段總共有10個字母組成&#xff1b;第一個字符代表文件的類型。 文件屬性字段 字母“-”表示該文件是一個普通文件字母“d”表示該文件是一個目錄&#xff0c;字母”d”&#xff0c;是dirtectory(目錄)的縮寫&#xff1b…