我讀C++ Primer - string vector 與數組

在第二章主要介紹了C++ 的內置類型,除此之外,還有許多標準庫中的類型也經常用到,這裏這要講string vector,以及數組。

string表示可變長的字符序列,vector表示某種給定類型的可變長序列,他們都是標準庫類型。

頭文件中不應該包含using聲明,防止與包含此頭文件的文件中有命名衝突。


1 標準庫類型 string

包含頭文件:

#include <string>
using std::string;
(1) 定義與初始化

默認初始化爲空的string

string s1;
string s2(s1);
string s2 = s1;
string s3("value");
string s4(n,'c');

(2) 操作string

os<<s
is>>s
getline(is,s)
s.empty()
s.size()
s[n]
s1 + s2
s1 = s2
s1 == s2
< <= > >=
其中,讀取一整行 getline(cin, s)  

size() 函數返回的是size_type類型,無符號,注意避免與int 混用

字面值與string 對象相加減,必須保證+ 的兩側至少一個是string

(3) 處理string中字符

isalnum(c)  //判斷字母或數字
isalpha(c)  //字母
iscntrl(c)  //控制字符
isdigit(c)  //數字
isgraph(c)  //不是空格但可打印
islower(c)  //小寫字母
isprint(c)  //可打印(空格或可視形式)
ispunct(c)  //標點符號
isspace(c)  //空白
isupper(c)  //大寫字母
isxdigit(c) //十六進制數字
tolower(c)  //輸出小寫字母
toupper(c)  //輸出大寫字母

輸出string中每個對象

string str("some string");
for (auto c : str)
    cout<<c<<endl;
若要改變字符串中字符,用引用

string str("some string");
for (auto &c : str)
    c = toupper(c);
    cout<<str<<endl;


2 標準庫類型vector

#include<vector>
using std::vector;
(1)定義和初始化vector

最常用的形式是定義一個空vector 然後在添加元素值

vector<T> v1
vector<T> v2(v1)
vector<T> v2 = v1
vector<T> v3(n,val)
vector<T> v4(n)
vector<T> v5{a,b,c...}
(2) 添加元素

向vector 添加元素使用的如此頻繁,以至於拿出來單獨介紹

vector<int> v;
for(int i = 0; i < 100; ++i)
    v.push_back(i);
不過要注意的是for循環中不應該改變vector的大小

(3) 其他操作

v.empty()
v.size()
v[n]
v1 = v2
v1 = {a,b,c...}
v1 == v2
< <= > >=
對vector進行存取可以使用下標或者迭代器,要注意的是使用下標要檢查元素是否存在,不能用下標來添加元素


(3) 迭代器

所有標準庫容器都可以使用迭代器來遍歷容器中元素。

這裏列舉一個使用迭代器運算實現的二分搜索:

// text 有序
// sought 是要找的元素
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2;

while (mid != end && *mid != sought)
{
    if (sought < *mid)
        end = mid;
    else
        beg = mid + 1;
    
    mid = beg + (end - beg) / 2;
}


4 數組

數組也是存放相同類型對象的容器,與vector 不同的是,數組的大小確定不變,不能隨意添加元素

(1) 定義和初始化數組

數組的聲明形式 a[d] a是數組名字,d是數組維度,也即元素個數。維度必須是一個常量表達式

int a[10];
const int num = 10;
int b[num] = {0,1,2};
char c[] = {'c','+','+'};
char c2[] = "C++";

注意,默認數組初始化爲0,最後一種用字面值初始化數組會自動添加‘\0’
對於某些複雜數組的聲明(如數組指針,指針數組),最好按照從數組名字由內向外的順序閱讀
(2) 訪問數組元素

使用下標方式,注意檢查是否越界

(3) 指針與數組

使用數組的時候,編譯器一般會把數組名字轉換成指向數組首元素的指針

對數組元素取地址能得到指向該元素的指針:

string nums[] = {"one","two"};
string *p = &nums[0];
因爲指針操作接近底層,所以容易引發一些與煩瑣細節有關的錯誤,導致使用指針與數組容易出錯。

因此C++程序應儘量使用vector和迭代器,避免使用內置數組和指針;儘量使用string,避免使用C風格的基於數組的字符串。

(4) 多維數組

多維數組就是數組的數組。

int a[3][4];
int b[10][20][30] = {0};
int c[3][4] = {
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};
操作多維數組也是使用下標,如:

for (auto &row : a)
{
    for (auto &col : row)
    {
        col = 1;
    }
}
由多維數組名得來的指針實際上是指向第一個內層數組的指針



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