字串,陣列,向量
標準庫型別string
#include<string>
string 定義在名稱空間std中
- //string函式用法詳解!附程式碼,寫具體的用法!
- #include <iostream>
- #include <string>
- #include <sstream>
- using namespace std;
- int main()
- {
- //1.string類過載運算子operator>>用於輸入,同樣過載運算子operator<<用於輸出操作
- string str1;
- cin >> str1;//當用cin>>進行字串的輸入的時候,遇到空格的地方就停止字串的讀取輸入
- cout << str1 << endl;
- cin.get();//這個的作用就是讀取cin>>輸入的結束符,不用對getline的輸入產生影響!
- getline(cin, str1);//字串的行輸入
- cout << str1 << endl;
- //2.string類的建構函式
- string str2 = "aaaaa"
- cout << str2 << endl;
- char *s = "bbbbb";
- string str3(s);//用c字串s初始化
- cout << str3 << endl;
- char ch = 'c';
- string str4(5, ch);//用n個字元ch初始化
- cout << str4 << endl;
- //3.string類的字元操作
- string str5 = "abcde"
- ch = str5[3];//operator[]返回當前字串中第n個字元的位置
- cout << ch << endl;
- string str6 = "abcde";
- ch = str6.at(4);//at()返回當前字串中第n個字元的位置,並且提供範圍檢查,當越界時會丟擲異常!
- cout << ch << endl;
- //4.string的特性描述
- string str7 = "abcdefgh";
- int size;
- size = str7.capacity();//返回當前容量
- cout << size << endl;
- size = str7.max_size();//返回string物件中可存放的最大字串的長度
- cout << size << endl;
- size = str7.size();//返回當前字串的大小
- cout << size << endl;
- size = str7.length();//返回當前字串的長度
- cout << size << endl;
- bool flag;
- flag = str7.empty();//判斷當前字串是否為空
- cout << flag << endl;
- int len = 10;
- str7.resize(len, ch);//把字串當前大小置為len,並用字元ch填充不足的部分
- cout << str7 << endl;
- //5.string的賦值
- string str8;
- str8 = str7;//把字串str7賦給當前字串
- cout << str8 << endl;
- str8.assign(str7);//把字串str7賦給當前字串
- cout << str8 << endl;
- str8.assign(s);//用c型別字串s賦值
- cout << str8 << endl;
- str8.assign(s, 2);//用c型別字串s開始的n個字元賦值
- cout << str8 << endl;
- str8.assign(len, ch);//用len個字元ch賦值給當前字串
- cout << str8 << endl;
- str8.assign(str7, 0, 3);//把字串str7中從0開始的3個字元賦給當前字串
- cout << str8 << endl;
- string str9 = "0123456789";
- str8.assign(str9.begin(), str9.end());//把迭代器之間的字元賦給字串
- cout << str8 << endl;
- //6.string的連線
- string str10;
- str10 += str9;//把字串str9連線到當前字串的結尾
- cout << str10 << endl;
- str10.append(s);//把c型別字串s連線到當前字串的結尾
- cout << str10 << endl;
- str10.append(s, 2);//把c型別字串s的前2個字元連線到當前字串的結尾
- cout << str10 << endl;
- str10.append(str9.begin(), str9.end());//把迭代器之間的一段字元連線到當前字串的結尾
- cout << str10 << endl;
- str10.push_back('k');//把一個字元連線到當前字串的結尾
- cout << str10 << endl;
- //7.string的比較
- flag = (str9 == str10);//判斷兩個字串是否相等
- cout << flag << endl;
- flag = (str9 != str10);//判斷兩個字串是否不相等
- cout << flag << endl;
- flag = (str9 > str10);//判斷兩個字串是否大於關係
- cout << flag << endl;
- flag = (str9 < str10);//判斷兩個字串是否為小於關係
- cout << flag << endl;
- flag = (str9 >= str10);//判斷兩個字串是否為大於等於關係
- cout << flag << endl;
- flag = (str9 <= str10);//判斷兩個字串否為小於等於關係
- cout << flag << endl;
- //以下的3個函式同樣適用於c型別的字串,在compare函式中>時返回1,<時返回-1,=時返回0
- flag = str10.compare(str9);//比較兩個字串的大小,通過ASCII的相減得出!
- cout << flag << endl;
- flag = str10.compare(6, 12, str9);//比較str10字串從6開始的12個字元組成的字串與str9的大小
- cout << flag << endl;
- flag = str10.compare(6, 12, str9, 3, 5);//比較str10字串從6開始的12個字元組成的字串與str9字串從3開始的5個字元組成的字串的大小
- cout << flag << endl;
- //8.string的字串
- string str11;
- str11 = str10.substr(10, 15);//返回從下標10開始的15個字元組成的字串
- cout << str11 << endl;
- //9.string的交換
- str11.swap(str10);//交換str11與str10的值
- cout << str11 << endl;
- //10.string的查詢,查詢成功時返回所在位置,失敗時返回string::npos的值,即是-1
- string str12 = "abcdefghijklmnopqrstuvwxyz";
- int pos;
- pos = str12.find('i', 0);//從位置0開始查詢字元i在當前字串的位置
- cout << pos << endl;
- pos = str12.find("ghijk", 0);//從位置0開始查詢字串“ghijk”在當前字串的位置
- cout << pos << endl;
- pos = str12.find("opqrstuvw", 0, 4);//從位置0開始查詢字串“opqrstuvw”前4個字元組成的字串在當前字串中的位置
- cout << pos << endl;
- pos = str12.rfind('s', string::npos);//從字串str12反向開始查詢字元s在字串中的位置
- cout << pos << endl;
- pos = str12.rfind("klmn", string::npos);//從字串str12反向開始查詢字串“klmn”在字串中的位置
- cout << pos << endl;
- pos = str12.rfind("opqrstuvw", string::npos, 3);//從string::pos開始從後向前查詢字串s中前n個字元組成的字串在當前串中的位置
- cout << pos << endl;
- string str13 = "aaaabbbbccccdddeeefffggghhhiiijjjkkllmmmandjfaklsdfpopdtwptioczx";
- pos = str13.find_first_of('d', 0);//從位置0開始查詢字元d在當前字串第一次出現的位置
- cout << pos << endl;
- pos = str13.find_first_of("eefff", 0);//從位置0開始查詢字串“eeefff“在當前字串中第一次出現的位置
- cout << pos << endl;
- pos = str13.find_first_of("efff", 0, 3);//從位置0開始查詢當前串中第一個在字串”efff“的前3個字元組成的數組裡的字元的位置
- cout << pos << endl;
- pos = str13.find_first_not_of('b', 0);//從當前串中查詢第一個不在串s中的字元出現的位置
- cout << pos << endl;
- pos = str13.find_first_not_of("abcdefghij", 0);//從當前串中查詢第一個不在串s中的字元出現的位置
- cout << pos << endl;
- pos = str13.find_first_not_of("abcdefghij", 0, 3);//從當前串中查詢第一個不在由字串”abcdefghij”的前3個字元所組成的字串中的字元出現的位置
- cout << pos << endl;
- //下面的last的格式和first的一致,只是它從後面檢索!
- pos = str13.find_last_of('b', string::npos);
- cout << pos << endl;
- pos = str13.find_last_of("abcdef", string::npos);
- cout << pos << endl;
- pos = str13.find_last_of("abcdef", string::npos, 2);
- cout << pos << endl;
- pos = str13.find_last_not_of('a', string::npos);
- cout << pos << endl;
- pos = str13.find_last_not_of("abcdef", string::npos);
- cout << pos << endl;
- pos = str13.find_last_not_of("abcdef", string::npos, 3);
- cout << pos << endl;
- //11.string的替換
- string str14 = "abcdefghijklmn";
- str14.replace(0, 3, "qqqq");//刪除從0開始的3個字元,然後在0處插入字串“qqqq”
- cout << str14 << endl;
- str14.replace(0, 3, "vvvv", 2);//刪除從0開始的3個字元,然後在0處插入字串“vvvv”的前2個字元
- cout << str14 << endl;
- str14.replace(0, 3, "opqrstuvw", 2, 4);//刪除從0開始的3個字元,然後在0處插入字串“opqrstuvw”從位置2開始的4個字元
- cout << str14 << endl;
- str14.replace(0, 3, 8, 'c');//刪除從0開始的3個字元,然後在0處插入8個字元 c
- cout << str14 << endl;
- //上面的位置可以換為迭代器的位置,操作是一樣的,在這裡就不再重複了!
- //12.string的插入,下面的位置處亦可以用迭代器的指標表示,操作是一樣的
- string str15 = "abcdefg";
- str15.insert(0, "mnop");//在字串的0位置開始處,插入字串“mnop”
- cout << str15 << endl;
- str15.insert(0, 2, 'm');//在字串的0位置開始處,插入2個字元m
- cout << str15 << endl;
- str15.insert(0, "uvwxy", 3);//在字串的0位置開始處,插入字串“uvwxy”中的前3個字元
- cout << str15 << endl;
- str15.insert(0, "uvwxy", 1, 2);//在字串的0位置開始處,插入從字串“uvwxy”的1位置開始的2個字元
- cout << str15 << endl;
- //13.string的刪除
- string str16 = "gfedcba";
- string::iterator it;
- it = str16.begin();
- it++;
- str16.erase(it);//刪除it指向的字元,返回刪除後迭代器的位置
- cout << str16 << endl;
- str16.erase(it, it+3);//刪除it和it+3之間的所有字元,返回刪除後迭代器的位置
- cout << str16 << endl;
- str16.erase(2);//刪除從字串位置3以後的所有字元,返回位置3前面的字元
- cout << str16 << endl;
- //14.字串的流處理
- string str17("hello,this is a test");
- istringstream is(str17);
- string s1,s2,s3,s4;
- is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test"
- ostringstream os;
- os<<s1<<s2<<s3<<s4;
- cout<<os.str() << endl;
- system("pause");
- }
#include <cctype>
cctype標頭檔案中的函式
isalnum(c) 當c為字母或數字時為真
isalpha(c) 當c為字母時為真
iscntrl(c) 當c為控制字元時為真
isdigit(c) 當c為數字時為真
isgraph(c) 當c不是空格但可列印時為真
islower(c) 當c為小寫字母時為真
isprint(c) 當c為可列印字元時為真(即c為空格或者c具有視覺化形式)
ispunct(c) 當c為標點符時為真(即c不是控制符,數字,字母可列印空白的一種)
isspace(c) 當c是空白時為真(即c為空格,橫向製表符,縱向製表符,回車符,換行符,進位制符的一種)
isupper(c) 當c為大寫字母是為真
isxdigit(c) 當c為十六進位制數字時為真
tolower(c) 把c變成小寫
toupper(c) 把c變成大寫
·
範圍for迴圈
for(declaration : expression)
標準庫型別vector
#include <vector>
using std:: vector;
基本形式:vector<type>name
注:vector是模板而非型別
vector能容納絕大多數型別的物件作為元素,但因為引用不是物件,所以不包含引用的vetcor
初始化vector
C++提供了幾種不同的初始化方式
1.使用拷貝初始化(即使用=)
2.如果提供的是一個類內初始值則只能使用拷貝初始化或者使用花括號的形式初始化
3.(特殊)如果提供的是初始元素值的列表,則只能把初始值都放在花括號裡進行列表初始化,而不能用圓括號
eg: vector<string> v1{"ac","an","the"}; // 列表初始化
vector<string> v2("ac","an","the") //error
列表初始值or元素數量
eg: vetcor<int>v1(10); //v1中有十個元素,每個值都為10
vector<int>v2{10}; //v2中有一個元素,值為10
vetcor<int>v3(10,6) //v3中有10個6
vector<int>v4{10,6} //v4中有兩個元素10和6
向vector裡新增元素
eg:
vector<int>vint;
for(int i=1;i<=10;i++)
vint.push_back(i);
形式:name.push_back(value)
vector的相關操作
v.empty();
v.size();
v.capacity();
v.push_back(t);
v1=v2;
和陣列,string一樣vector物件下標也是從0開始的
利用範圍for迴圈可以處理vector裡的元素
eg:
vector<int>vint;
for(int i=1;i<=6;i++)
vint.push_back(i);
for(auto &i : vint)
cout<<i<<" ";
cout<<endl;
vector不能用下標形式新增元素,只能對已知存在的元素進行下標操作
確保下標合法的一種有效操作就是使用範圍for語句
迭代器(迭代器是一種檢查容器內元素並遍歷元素的資料型別)
迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。
eg:
string str("basketball nba");
if(str.begin()!=str.end())
{
auto i=str.begin();
*i=toupper(*i);
}
注意迭代器失效
但凡是使用了迭代器的迴圈體,都不要向迭代器所屬的容器新增元素
陣列
陣列是一種複合型別,類似於vector的資料結構,但在效能和靈活性的權衡上又與vector有所不同。
陣列不能隨意新增元素
陣列大小固定
如果不清楚元素確切的個數,使用vector
陣列不允許拷貝賦值
eg:
int a[]={1,2,3};
int a2[]=a; //error,不允許使用一個數組初始化另一個數組
a2=a; //error,不能把一個數組直接賦值給另一個數組
複雜的陣列宣告
eg:
int *ptrs[10]; //ptrs是含有10個整型指標的陣列
int &refs[10]=/*?*/; //error,陣列不存在引用
int (*Parray)[10]=&arr; //Parray指向一個含有10個整數的陣列
int (&arrRef)[10]=arr; //arrRef引用一個含有10個整數的陣列
指標陣列與陣列指標的區別
指標陣列 字元陣列 整數陣列 --- 前兩個個字指的是陣列元素型別
陣列指標 字元指標 整數指標 --- 前兩個個字指的是指標的型別
1.指標陣列是一個數組,只不過它存放的元素都是指標 例如:
int
*a[10];
2.陣列指標是一個指標,指向陣列型別的指標 例如:
int
(*a)[10];
指標陣列:首先它是一個數組,陣列的元素都是指標,陣列佔多少個位元組由陣列本身的大小決定,每一個元素都是一個指標,在32 位系統下任何型別的指標永遠是佔4 個位元組。它是“儲存指標的陣列”的簡稱。
陣列指標:首先它是一個指標,它指向一個數組。在32 位系統下任何型別的指標永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道,具體要看陣列大小。它是“指向陣列的指標”的簡稱。
eg:
#include <iostream>
using namespace std;
void funcintarray(int *a)
{
for (int i = 0; i < 10; i++)
cin >> *(a + i);
for (int i = 0; i < 10; i++)
cout << *(a + i)+1 << " ";
cout << endl;
for (int i = 0; i < 10; i++)
cout << &a + i << " ";
cout << endl;
cout << a+1 << endl;
cout << a + 2 << endl;
}
int main()
{
int a[10];
funcintarray(a);
system("pause");
return 0;
}
#include <iostream>
using namespace std;
void funcDoubleIntArray(int (*b)[5])
{
for (int i = 0; i < 2; i++)
for (int j = 0; j < 5; j++)
cin >> *(*(b + i) + j);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 5; j++)
cout << *(*(b + i) + j) << " ";
cout << endl;
}
int main()
{
int a[2][5] = {{ 1,2,3,4,5 },{ 6, 7, 8, 9, 10 }};
int(*b)[5];
b = a;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 5; j++)
cout << *(*(b + i) + j) << " ";
cout << endl;
funcDoubleIntArray(b);
system("pause");
return 0;
}