最近可能要参加秋招面试........最近还要顺便复习整理一下之前的一些技巧,整理归纳一下。倒不是说放弃考研了,而是尽可能找一个普通的工作保底吧......


一.函数模板

模板,顾名思义,任何类型都可以套用,分享一个打印任何类型vector的一个方法,语法如下:

template<class T>
void Myprint(vector<T> Vx)
{
 for(int i=0;i<=Vx.size()-1;i++)
 cout<<Vx[i]<<" ";
 cout<<endl;
 //模板方法!打印任何类型的 vector! 
}

核心语句是:template<class T>

二.string 和 vector 的区别总结

首先要明白字符与字符串的最大区别:"JSL"是字符串,'J'是字符,本质上就是双引号和单引号的区别。这一点可能在JavaScript等脚本语言(或弱语言)不严格,但C++中很严格!

string temp1="7371";
char temp2[5]="7166";
//注:采用这种方式赋值,需要将下标多于字符串一位

如下是两个vector,一个为string类,另一个是char类。

vector<string> S1;
vector<char> C1;

如下,temp1和temp2均可以压入string型的s1,而作为char型的temp3则不行。原因在于,char型数组本质上也是字符串,因此可以压入string类的S1中。但是,说个题外话,char型数组版的字符串,不能通过"+"运算符起到拼接字符串的作用~

char temp3='3'; 
S1.push_back(temp1);
S1.push_back(temp2);
//string 型的 vector,可以将 char 类型的数组压入
//而采用单引号的 char 字符,则不能压入!

用好vector这一容器的核心在于:一定要清楚vector内部装的是什么东西

string temp4=S1[2];
//注意:vector<string>型的每一位,仍然为字符串型,而不是
//char 类型,此处 temp4 如果为 char 型会报错!

此处再分享一种C语言类型的字符串:

如下是C知道给出的解释:

注意:另一个很微妙又有些绕的地方: string 的每一位为 char 型但是如果是 vector<string> 型,每一位则为 string!如果想取出vector中string元素的某一位,可以采用中间变量先解析出当前下标对应的vector,千万不要混淆~

此前一篇博客的辨析说得更加清楚一些:

三.vector的随机插入与删除

vector<int> V2;
for(int i=1;i<=10;i++)
V2.push_back(i);
for(vector<int>::iterator it=V2.begin();it!=V2.end();it++)
cout<<(*it)<<" ";
cout<<endl;
vector<int>::iterator it=V2.begin();
上述代码创建指向开头的迭代器,便于 insert 和 erase 方法的实施。
删除下标为 2-4 的元素:
for(int j=2;j<=4;j++)
V2.erase(it+j);
在下标为 5 处连续插入 5 个 100:
V2.insert(it+5,5,100);

四.deque双端动态数组

deque的操作与vector基本一致,但是支持双向操作:

deque<int> D;   
    for(int i=0;i<=V2.size()-1;i++)  
    {  
        D.push_back(V2[i]);  
        //从左往右压   
        D.push_front(V2[i]);  
        //从右往左压   
    }  
    for(deque<int>::iterator it=D.begin();it!=D.end();it++)  
    {  
        //注意,deque的指针是从front部分开始的!   
        cout<<(*it)<<" ";  
    }  
    cout<<endl;  

assign函数类似erase,不过具体功能是拷贝,而at就是简单的遍历。

 deque<int> D1;  
 D1.assign(D.begin(),D.begin()+2);
 cout<<D.at(3)<<endl; 

五.list链表  

具体内容全部包含在如下代码中:

list<int> L;  
    vector<int> V;  
       
    for(int i=1;i<=10;i++)  
    {  
        L.push_back(i);  
        L.push_front(2*i);    
        //list同样为双端   
    }   
    //链表的元素添加更快一些  
    for(list<int>::iterator it=L.begin();it!=L.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    //而遍历则会慢一些  
    //list慎用,其不支持随机访问,如cout<<L[3]<<endl是错的   
    //且其不能使用stl的标准算法,竞赛中不建议使用  

六.set顺序集和multiset复合集

具体代码如下:

set<int> E;  
    //无重复元素   
    multiset<int> M;   
    //有重复元素   
    //均包含在头文件set中   
      
    for(int i=10;i>=1;i--)  
    {  
        E.insert(i);   
        E.insert(i);   
        M.insert(i);  
        M.insert(i);  
    }  
    for(set<int>::iterator it=E.begin();it!=E.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    for(set<int>::iterator it=M.begin();it!=M.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    //两者都会自动排序,但set会自动剔除重复元素  
    //注意:set并不支持下标的访问方式  
    set<char> E1;  
    E1.insert('j');  
    E1.insert('j');  
    E1.insert('s');  
    E1.insert('l');  
    for(set<char>::iterator it=E1.begin();it!=E1.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;  
    //一个比较好的想法是,用char型的set处理不重复字符串

七.pair二值对(对组)

pair<int,string> p1(7371,"jsl");  
pair<int,string> p2(7166,"hyh");  
cout<<p1.second<<" love "<<p2.second<<endl;  
//通过.的方式获取元素属性,写法与结构体类似   
//通常情况可以采用二值对,偶尔采用结构体也是不错的选择。         
//!注意:map太复杂了,不使用。宁可用vector & struct混用。   

注:还有一种STL容器叫做map,个人感觉复杂,不建议使用:宁可用vector & struct混用

八.字符串处理合集

之前发过一篇:https://blog.csdn.net/jsl123x/article/details/129632297

    char goal[]="jsl love hyh.";  
    char target[]="hyh in my heart.";  
    //如果字符串的长度已知,可以直接开不定长空间完成赋值。  
    strcat(goal,"you konw?");  
    cout<<goal<<endl;  
    //strcat用于将后面的字符串拼接在前面  
    cout<<strcspn(goal,"l")<<endl;   
    //strcspn用于检索字符第一次出现的位置  
    cout<<strcmp(target,"agdsg")<<endl;  
    //strcmp用于比较两个字符串的大小,0表示相等,正数代表前面的大   

 下面这段偏C++风格:

string S3="JSL and HYH both come from TaiYuan.";   
    S3.assign("JSL and HYH both come from TaiYuan.");  
    //assign等价于“=”   
    S3+="FCB";  
    S3.append("FCB");  
    //append等价于“+=” (char型数组不能用+=)  
    cout<<S3<<endl;  
    string s4;  
//  getline(cin,s4);  
    //不跳过空格读取字符串  
    S3.replace(2,4,"fadg");  
    cout<<S3<<endl;  
    //从下标2处删去4个字符,用fasd代替   
    //无论删去多少,也只补后面字符串那么多的长度  
    cout<<S3.find('J')<<endl;  
    //find函数返回第一次出现J的下标  
    cout<<S3.rfind('H')<<endl;  
    //rfind返回最后一次 出现的下标   
  
    reverse(S3.begin(),S3.end());  
    cout<<S3<<endl;  
    S3.insert(S3.begin(),'R');  
    //在指定位置插入目标字符   
    cout<<S3<<endl;  
    S3.insert(S3.begin()+2,'R');  
    cout<<S3<<endl;  
    //指针移位,在特定位置上插入字符!  

九.数字与字符相互转化 

(1)字符型数字转为整型数字

    string s11="123";  
    char s111[s11.size()];  
    for(int i=0;i<=s11.size()-1;i++)  
    {  
        s111[i]=s11[i];  
    }  
    int a11=atoi(s111);  
    //atoi只对合法的数字有效   
    //此外,变量必须为char类型的   
    cout<<(a11)<<endl;  

(2)整型数字转为字符型数字

int a22=123;  
    char a222[5];  
    itoa(a22,a222,10);  
    a222[3]='c';  
    cout<<a222<<endl; 

(3)字符型数字转为对应字母 

string s13="1";  
    cout<<(s13[0]-48)<<endl;  
    //注意,此处字符型的1对应ascii码49,所以减去48即为数字型的本身   

(4)对应字母转换为字符型数字

    char c111='c';  
    char i111=c111-48;  
    cout<<i111<<endl;

(5)整型数字转为对应字母

    int i21=3;  
    char c21=(i21+96);  
    //加96可以直接强转自习室   
    cout<<c21<<endl;   

(6)对应字母转为整型数字

char c4='c' ;  
    int i4=c4-96;  
    cout<<(i4*5)<<endl;  
    //对于小写英文字母,-96可以得到对应的数字顺位 ,大写-64   
    //此处c对应3   
    return 0;  

附注刷题网:【赛码网】在线考试系统、在线面试系统-易用稳定专业

算法题必备基础技巧(C++版)-LMLPHP

09-20 20:03