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;
關鍵概念:泛型程式設計常量begin和end用c++程式設計師習慣性的在迴圈中使用!=,因為所有標準庫容器都定義了==和!=,但是它們大多數都沒有定義《運算子。因此,只要養成使用迭代器和!=的習慣,就不用太在意用的到底是哪種容器型別。
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物件和字元...