本文已参与「新人创作礼」活动,一起开启掘金创作之路。
函数模板
通用算法:函数模板,也成泛型算法。
用template关键字增加一个模板头,将数据类型变成类型模板参数。
#include<iostream>
using namespace std;
template<typename T>
T add(T x, T y){
return x + y;
}
int main(){
cout << add<int>(5, 3) << endl;
return 0;
}
函数模板本身不是函数,之后模板实例化产生具体的函数
这里会产生一个int版本的函数
模板参数也可以自动推断:
#include<iostream>
using namespace std;
template<typename T>
T add(T x, T y){
return x + y;
}
int main(){
cout << add<int>(5, 3) << endl;
cout << add(2.2, 1.1) << endl;
//cout << add(5, 1.1) << endl; //(×)歧义,所以要指明
cout << add<double>(5, 1.1) << endl;
return 0;
}
string、vector
string
是一个用户定义类型,初始化方法:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1 = "aaa";
string s2("bbb");
string s3{"ccc"};
cout << s1 << s2 << s3;
return 0;
}
aaabbbccc
一些方法:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1 = "hello";
string s2("world");
cout << s1.size() << endl;
string s3 = s2.substr(1, 3);
cout << s3 << endl;
cout << s1 + " " + s3 << endl;
s1[0] = 'H';
s2[0] = 'W';
string s4 = s1.insert(3, "iii");
cout << s4 + " " << s2 << endl;
cout << s4.find("ii") << endl;
return 0;
}
5
orl
hello orl
Heliiilo World
3
vector
向量,类似于数组,但可以动态增长,要#include<vector>,注意也要std::vector
是一个类模板,实例化产生一个类,如:vector<int> v产生一个数据元素是int的vector<int> v类(向量),可以通过vector<int> v类对象去访问其成员,如成员函数。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {1, 3, 5};
for (int i = 0; i < v.size(); i++){
cout << v[i] << '\t';
}
cout << endl;
v.push_back(2);
for (int i = 0; i < v.size(); i++){
cout << v[i] << '\t';
}
cout << endl;
v.pop_back();
for (int i = 0; i < v.size(); i++){
cout << v[i] << '\t';
}
v.resize(2);
cout << endl;
for (int i = 0; i < v.size(); i++){
cout << v[i] << '\t';
}
cout << endl;
v.resize(5);
for (int i = 0; i < v.size(); i++){
cout << v[i] << '\t';
}
return 0;
}
1 3 5
1 3 5 2
1 3 5
1 3
1 3 0 0 0
不过这里会有警告:warning: comparison between signed and unsigned integer expressions [-Wsign-compare],把i改成unsigned int就行