最近可能要参加秋招面试........最近还要顺便复习整理一下之前的一些技巧,整理归纳一下。倒不是说放弃考研了,而是尽可能找一个普通的工作保底吧......
一.函数模板
模板,顾名思义,任何类型都可以套用,分享一个打印任何类型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语言类型的字符串:
注意:另一个很微妙又有些绕的地方: 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();
for(int j=2;j<=4;j++)
V2.erase(it+j);
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;