一、 cin、getline()、cin.getline()區別
C++輸入過程中,是把輸入加載到緩沖區中,然后對緩沖區中的字符進行讀取。
1. cin
結束條件:[enter],[space],[tab]
處理方法:cin遇到緩沖區中的[enter],[space],[tab]會結束當前輸入,並舍棄[enter],[space],[tab],繼續下一項輸入,當有連續[space],[enter,[tab]會全部舍棄。
2. getline()
用於string類的。使用需包含頭文件#include<string>。getline(cin,string s),接收一個字符串,可以接收空格、回車等
與cin.getline()的區別:1.cin.getline()接收輸入字符串的是數組,getline()是string類型。
2.cin.getline()可以接收空格,但不能接收回車;getline()可以接收空格和回車
3.cin.getline()會在數組結尾是'\0',getline()不會
3. cin.getline()
實際是cin.getline(接收字符串到m,接收個數n,結束字符)。接收一個字符串,可以接收空格等,最后一個字符為‘\0’。結束符可以通過設置第三個參數自己設置,默認是回車。m不能為string類型。
注意:實際接收到的要比n少一個,因為最后一個字符為'\0'。
二、 字符串類型String
string類型的字符串是不以‘\0’結尾的,因此若str有三個字符,傳統C語言的字符串的str[3]是字符‘\0’,但是string類型的只能到str[2],str[3]是沒有定義的。
要使用strlen()、strcpy()函數需要包含C語言的字符串操作函數頭文件。
#include <string.h> using namespace std; //上述兩行代碼等價於下面一行代碼 #include <cstring>
#include <string>
using namespace std;
string str;
1. str.length()
返回字符串的長度. 這個數字應該和size()返回的數字相同。
2. str.size()
函數返回字符串中現在擁有的字符數。
3. str.append()
str.append(num, ch):末尾添加num個字符ch;
str.append(str1, index, len):末尾添加str1的字符串,下標從inddex開始,長度len;
4. str.substr()
str.substr(index, num):返回本字符串的一個子串,從index開始,長num個字符。如果沒有指定num,函數將簡單的返回從index開始的剩余的字符串。妙用:剪切字符串。
5. str.begin() str.end()
迭代器
6. str.rbegin() str.rend()
逆迭代器
7. str.find()
size_t position = str.find(const basic_string &s, size_type length ); //從下標index開始,尋找長度為length,返回字符串s在str中第一次出現的位置。未找到返回string::npos。
size_t position = str.find( char ch, size_type index ); //從下標index開始,返回字符ch在str中第一次出現的位置。未找到返回string::npos。
8. str.find_first_of()
同find()。
三、 vector set map queue
1. vector
基礎知識:
vector是表示可變大小數組的序列容器。
就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味着可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自動處理。
本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小為了增加存儲空間。其做法是,分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,vector並不會每次都重新分配大小。
注意:
想對vector直接賦值就得定義大小,如果不定義大小,直接賦值會出錯,只能用push_back
常用操作:
#include <vector>
typedef struct test{
...
};
test tt;
vector<test> sec;
sec.push_back(tt);
vector< ElemetType> vec;
vector< ElemetType> tmp; //非空
ElemetType b[N]={....};
訪問:
- vec.back():末尾元素
- vec.front():第一個元素
容量:
- vec.size();
修改:
- vec.push_back():末尾添加
- vec.pop_back():末尾刪除
- vec.assign(b,b+N)
- vec=tmp
迭代器:
- vec.begin():開始
- vec.end():結束
算法:
遍歷:
vector<int>::iterator it; for(it=vec.begin(); it!=vec.end(); it++) cout<<vec[it]<<endl; //或者 for (size_t i = 0; i < vec.size(); i++) { cout << vec.at(i) << endl; }
sec.(...);
翻轉:
#include <algorithm> reverse(vec.begin(), vec.end());
元素排序
#include <algorithm> sort(vec.begin(), vec.end()); //采用的是從小到大的排序 //如果想從大到小排序,可以采用上面反轉函數,也可以采用下面方法: bool Comp(const int& a, const int& b) { return a > b; } sort(vec.begin(), vec.end(), Comp);
2. set
set作為一個容器是用來存儲同一數據類型的數據類型,並且能從一個數據集合中取出數據,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序,set中數元素的值不能直接被改變。C++ STL中標准關聯容器set, multiset, map, multimap內部采用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。
#include <set>
ElementType a[N]={...};
set<ElementType> iset(a, a+N);
ElementType X;
iset.insert(X);
迭代:
for(set<ElementType>::iterator it=iset.begin();it!=iset.end();it++) cout<<*it<<endl;
3. map
Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由於這個特性,它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這里說下map內部數據的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的。
#include <map>
map對象是模板類,需要關鍵字和存儲對象兩個模板參數:
std:map<int,string> personnel;
插入:
數組形式:
例如mapStudent[1] = "student_one"; 可覆蓋原先數據。
大小:mapStudent.size();
遍歷:
map<int, string>::iterator iter; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++) cout<<iter->first<<' '<<iter->second<<endl;
4. queue
添加頭文件:
#include <queue>
常用的成員函數:
queue<ElementType> q; q.push(...); q.pop(); //沒有返回值 q.size(); q.empty; //空返回true ElementType t=q.front(); //返回第一個元素,沒有出隊 ElementType t=q.back(); //返回最后一個元素
四、 cout利用控制符dec、hex、oct分別輸出十進制、十六進制、八進制
默認進制為十進制,在修改進制之前,原來格式一直有效。
cout<<hex<<a;
cout<<oct<<a;
相關知識點:
用輸出流輸出的都是字符串;
五、字符串與其他類型轉換
其他類型轉字符串:
c++11標准增加了全局函數std::to_string:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
例如:
int n;
string str=to_string(n);
字符串轉其他類型:
采用標准庫中atoi函數,對於其他類型也都有相應的標准庫函數,比如浮點型atof(),long型atol()等等
例如:
std::string str = "123";
int n = atoi(str.c_str());
cout<<n; //123
atoi函數原型:
int atoi(const char *nptr);
如果第一個非空格字符存在,是數字或者正負號則開始做類型轉換,之后檢測到非數字(包括結束符 \0) 字符時停止轉換,返回整型數。否則,返回零,
const char *c_str();
c_str()函數返回一個指向正規C字符串的指針常量, 內容與本string串相同.(其實它指向的是string對象內部真正的char緩沖區),所以返回const,以防止用戶的修改。
六、stringstream類
要想在程序中使用 stringstream 類,我們需要在源程序文件中包含頭文件include<sstream>。
例程:
#include <sstream> float dollar = 1.00; stringstream ss; ss << "dozen: " << dozen << endl;
1. 類型轉換
string -> double/int
#include <iostream> #include <sstream> using namespace std; int main() { double dVal; int iVal; string str; stringstream ss;
// string -> double str = "123.456789"; ss << str; ss >> dVal; cout << "dVal: " << dVal << endl; // string -> int str = "654321"; ss.clear(); ss << str; ss >> iVal; cout << "iVal: " << iVal << endl; return 0; }
輸出: dVal: 123.457
iVal: 654231
2 格式化輸入
string inputString("123abc 123.4one two three four"); stringstream ss(inputString); string s; int i; double d; ss >> i >> s >> d; cout << i << " " << s.c_str() << " " << d ; while (ss >> s) cout <<" "<<s.c_str(); cout << endl;
華為題目:英文單詞逆序排放 I am a boy -> boy a am I
string s; getline(cin,s); stringstream ss(s); //賦值 string res="", tmp; while (ss>>tmp) { //空格 if (res=="") res=tmp; else es=tmp+" "+res; } cout<<res;
七、algorithm庫一些常用的方法
1. sort 排序
語法描述:sort(begin,end,cmp),cmp參數可以沒有,如果沒有默認非降序排序。
結構體排序:降序
struct text{ string str; int a; }; bool cmp(link x,link y) { return x.a>y.a; } vector<text> vec; //變量類型是結構體 ...... sort(vec.begin(),vec.end(),cmp);
2. count
例子:查找字符串中空格數目
string str; cin>>str; int blank_number=count(str.begin(), str.end(), ' ');
八、 isalpha、isalnum、islower、isupper用法
1.isalpha
isalpha()用來判斷一個字符是否為字母,如果是字符則返回非零,否則返回零。
cout << isalpha('a');//返回非零 cout << isalpha('2');//返回0
2.isalnum
isalnum()用來判斷一個字符是否為數字或者字母,也就是說判斷一個字符是否屬於a~z||A~Z||0~9。
cout << isalnum('a');//輸出非零 cout << isalnum('2');//非零 cout << isalnum('.');//零
3.islower
islower()用來判斷一個字符是否為小寫字母,也就是是否屬於a~z。
cout << islower('a');//非零 cout << islower('2');//輸出0 cout << islower('A');//輸出0
4.isupper
isupper()和islower相反,用來判斷一個字符是否為大寫字母。
cout << isupper('a');//返回0 cout << isupper('2');//返回0 cout << isupper('A');//返回非零