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

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


一.函数模板

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

template
void Myprint(vector Vx)
{
 for(int i=0;i<=Vx.size()-1;i++)
 cout<

核心语句是:template

二.string 和 vector 的区别总结

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

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

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

vector S1;
vector 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型的每一位,仍然为字符串型,而不是
//char 类型,此处 temp4 如果为 char 型会报错!

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

char *jsl="JSL";
如下是C知道给出的解释:

char* 是一个指向单个字符的指针,而char a[] 是一个字符数组。它们的本质属性是不同的。char* 可以指向一个字符串,通过指针可以随意操作字符串中的字符。而char a[] 是一个固定大小的字符数组,用于存储一串字符。

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

此前一篇博客的辨析说得更加清楚一些:
C++String 和 char类型的区别和用法辨析icon-default.png?t=N7T8https://blog.csdn.net/jsl123x/article/details/130004128

三.vector的随机插入与删除

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

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

 deque D1;  
 D1.assign(D.begin(),D.begin()+2);
 cout<

五.list链表  

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

list L;  
    vector V;  
       
    for(int i=1;i<=10;i++)  
    {  
        L.push_back(i);  
        L.push_front(2*i);    
        //list同样为双端   
    }   
    //链表的元素添加更快一些  
    for(list::iterator it=L.begin();it!=L.end();it++)  
        cout<<(*it)<<" ";  
    cout<

六.set顺序集和multiset复合集

具体代码如下:

set E;  
    //无重复元素   
    multiset M;   
    //有重复元素   
    //均包含在头文件set中   
      
    for(int i=10;i>=1;i--)  
    {  
        E.insert(i);   
        E.insert(i);   
        M.insert(i);  
        M.insert(i);  
    }  
    for(set::iterator it=E.begin();it!=E.end();it++)  
        cout<<(*it)<<" ";  
    cout<::iterator it=M.begin();it!=M.end();it++)  
        cout<<(*it)<<" ";  
    cout< E1;  
    E1.insert('j');  
    E1.insert('j');  
    E1.insert('s');  
    E1.insert('l');  
    for(set::iterator it=E1.begin();it!=E1.end();it++)  
        cout<<(*it)<<" ";  
    cout<

七.pair二值对(对组)

pair p1(7371,"jsl");  
pair p2(7166,"hyh");  
cout<

注:还有一种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<

 下面这段偏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<

九.数字与字符相互转化 

(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)<

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

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

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

string s13="1";  
    cout<<(s13[0]-48)<

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

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

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

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

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

char c4='c' ;  
    int i4=c4-96;  
    cout<<(i4*5)<

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

算法题必备基础技巧(C++版)_第1张图片

你可能感兴趣的:(C++,算法,c++,蓝桥杯)