牛客網--華為機試題相關知識(未完)


一、 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');//返回非零

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM