C Primer 第3章 字串 向量和陣列

2021-07-27 09:35:24 字數 4286 閱讀 9260

6 多維陣列

using namespace::name;

標頭檔案不應包含using宣告

使用等號(=)初始化乙個變數,實際上執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中去。如果不使用等號,則執行的是直接初始化

常用操作:

-getline(is,s)從is中讀取一行賦給s,返回is

-s.empty()s為空返回true,否則返回false

-s.size()返回s中字元的個數

其中getline函式從給定的輸入流中讀取內容,直到遇到換行符為止(注意換行符也被讀進來了),然後把所讀的內容存入到string物件中(注意不存換行符)。如果輸入的一開始就是換行符,那麼所得的結果是個空string

觸發getline函式返回的那個換行符實際上被丟棄掉了,得到的string物件中並不包含該換行符。

size()函式返回的型別是string::size_type型別,是無符號整型數,這體現了標準庫型別與機器無關的特性。在c++11新標準中,允許編譯器使用auto或者decltype來推斷變數的型別。

由於是無符號整型數,所以不能和負數比,因為負數會自動轉換成乙個比較大的無符號值。

字串字面值與string是不同的型別,字串無法用加號相連。

cctype標頭檔案中的函式:

isalnum(c)/isalpha(c)/iscntrl(c)/isdigit(c)/isgraph(c)/islower(c)

ispunct(c)/isspace(c)/isupper(c)/isxdigit(c)/tolower(c)/toupper(c)

在名為cname的標頭檔案中定義的名字屬於命名空間std,而定義在.h的標頭檔案中則不然。

處理每個字元,使用基於範圍的for語句

for (auto c : str)

cout

<< c << endl;

使用範圍for語句改變字串中的字元(使用引用)

for (auto &c : s)

c = toupper(c);

cout

<< s << endl;

string的下標運算子接受的是string::size_type的值,其他值會自動轉換為無符號型別。

vector的size返回的型別是vector::size_type

不能通過下標新增元素,正確的方法是使用push_back

超出下標範圍會產生緩衝區溢位(buffer overflow)

確保下標合法的一種有效手段就是盡可能使用範圍for語句。

vecotr::iterator it;

string::iterator it2;

vector::const_iterator it3; //唯讀

string::const_iterator it4; //唯讀

begin負責返回指向第乙個元素的迭代器

end返回「尾元素的下一位置」的迭代器,是本不存在的「尾後」元素。

如果容器為空,則begin和end返回的是同乙個迭代器,都是尾後迭代器。

for (auto it = text.cbegin();

it != text.cend() && !it->empty(); ++it)

cout

<< *it << endl;

關鍵概念:泛型程式設計

c++程式設計師習慣性的在迴圈中使用!=,因為所有標準庫容器都定義了==和!=,但是它們大多數都沒有定義《運算子。因此,只要養成使用迭代器和!=的習慣,就不用太在意用的到底是哪種容器型別。

常量begin和end用v.cbegin()v.cend()獲得

謹記,但凡是使用了迭代器的迴圈體,都不要向迭代器所屬的容器新增元素,這樣會使迭代器失效。

兩個迭代器相減的結果是它們之間的距離

距離型別是difference_type,是帶符號整數型

取中間:auto mid = vi.begin() + vi.size() / 2;

使用迭代器完成二分查詢:

auto beg = text.begin(), end = text.end();

auto mid = text.begin() + (end - beg)/2;

while (mid != eend && *mid != sought)

指向陣列的指標和引用

int (*parray) [10] = &arr;

int (&arrref) [10] = arr;

在使用陣列下標的時候,通常將其定義位size_t型別,這是一種機器相關的無符號型別,它被設計的足夠大以便能表示記憶體中任意物件的大小。在cstddef標頭檔案中定義了size_t型別,這個檔案是stddef.h的c++版本。

將陣列初始化為0:unsigned scores[11] = {};

在很多用到陣列名字的地方,編譯器都會自動的將其轉換位乙個指向陣列首元素的指標;意味著用auto時,初始化為陣列時,其實是指向陣列首元素的指標。二decltype返回的型別是陣列,陣列大小和原陣列一致。

指標也是迭代器

我們可使用不存在的元素位址作為尾後指標

int *e = &arr[10];

for (int *b = arr; b != e; ++b)

cout

<< *b << endl;

c++11中為了避免出錯引入了begin和end標準庫函式,用陣列名作為它們的引數。這兩個函式定義在iterator標頭檔案中

// find first negative number.

int *pbeg = begin(arr), *pend = end(arr);

while (pbeg != pend && *pbeg >=0)

++pbeg;

兩個指標相減的結果型別是一種名為ptrdiff_t的標準庫型別,和size_t一樣,也是一種定義在cstddef標頭檔案中的機器相關的型別。因為差值可能位負值,所以ptrdiff_t是一種帶符號型別。對於空指標同樣適用

string物件有c_str()方法為字元陣列賦值:

const char *str = s.c_str();

使用陣列初始化vector物件:

vectorivec(begin(int_arr), end(int_arr));

對於二維陣列來說,常把第乙個維度稱作行,第二個維度稱作列。

用花括號初始化每行元素:

int ia[3][4] = , , };

使用範圍for語句處理多維陣列

size_t cnt = 0;

for (auto &row : ia)

for (auto &col :row)

使用標準庫函式begin和end也能實現:

for (auto p = begin(ia); p != end(ia); ++p)
將4個整數組成的陣列命名位int_array:

using int_array = int[4];

typedef

int int_array[4];

第3章 字串 向量和陣列

using 宣告語句 編譯器從操作符左側所示作用域尋找右側那個名字 using namespace name 注 標頭檔案中不能有using宣告,標頭檔案中的內容會拷貝到所引用它的檔案中去,會引起名字衝突 標準庫型別string 表示可變長的字串行。包含在string標頭檔案 string的初始化方...

第3章 字串向量和陣列

1 標頭檔案不應該包含using宣告 2 直接初始化string str or string num,char 拷貝初始化 string str str2 3 getling cin,line 讀取一行直到遇到第乙個換行符讀取並丟棄換行符 4 如果一條語句中有size 函式,就不用int避免混用 5...

C primer字串 向量和陣列

1.cin string 型別 不讀取空格 2.getline 讀入內容直到換行符,保留空白符,換行符不不存入string 3.s.empty s為空則返回true,否則返回flase 4.s.size s中的字元的個數,返回值為無符號數 5.字面值與string物件相加 當把string物件和字元...