目录
国庆补课正式开始,呜呜,室友都回家了,宿舍只剩我一个人。
模版
template<class T>
T swap( const T &left, const T &right)
{
T temp = left;
left = right;
right = temp;
return left, right;
}
int main()
{
int a = 1, b = 2;
double c = 3, d = 4;
swap(a, b);
swap(c, d);
cout << "a=" << a << " ";
cout << "b=" << b<<endl;
cout << "c=" << c << " ";
cout << "d=" << d << endl;
}
string
string是一个被封装了的模版:
用法:可以直接相加:
string可以直接从标准输入流中直接字符,输出到标准输出流中:
string num3;
cout << "请输入字符:";
cin >> num3;
cout << "打印字符:";
cout << num3;
也可以直接用sting变量+字符串:
string num3;
cout << "请输入字符:";
cin >> num3;
cout << "打印字符:";
cout << num3+"SADASFD";
string支持两个版本的函数重载,一个事普通版本的,一个是const修饰的版本的:
string有一个size,它可以记录你的string变量有多长:
string num2 = "ABCDE";
for (size_t i = 0; i<num2.size(); i++)
{
cout << num2[i] << " " ;
}
cout << endl;
string num4("hello word");
for (size_t i = 0; i < num4.size(); i++)
{
cout << num4[i] << " ";
}
cout << endl;
另一种遍历方法:
迭代器
迭代器是一个类似于指针的东西,它在string里被typedefine了。
类似于堆里面的ptr指针:
string num1 = "safdsad";
string num3;
string::iterator it = num1.begin();
while (it != num1.end())
{
cout << *it << " ";
it++;
}
cout << endl;
反向迭代器
与迭代器正好相反,反向迭代器从字符串末尾开始打印:
反向迭代器的类型是:reverse
string num1 = "safdsad";
string num3;
string::reverse_iterator its = num1.rbegin();
while (its != num1.rend())
{
cout << *its << " ";
its++;
}
cout << endl;
范围for
范围for可以自动++,自动判断是否结束,其实底层是迭代器:
string num1 = "safdsad";
for (auto h1 : num1) //auto自动识别类型,这样就不用写reverse了
{
cout << h1;
}
cout << endl;
调用函数
void fun(string s1)
{
}
int main()
{
fun(num1);
}
假如要传参是应该直接传参吗,直接传参就是深拷贝,浅拷贝就类似栈那种,如果潜拷贝了栈就会被free两次,就会崩。
所以应该用引用,引用为了防止被修改需要再加一个const,但是加一个const又会出问题:
这是因为传进来的参数(数组)被const限制了,所以数组不能被修改了,但是我们的迭代器仍然有修改数组的能力,如下图:
所以我们要限制一下迭代器,让它不能修改数组,可能通过限制迭代器的begin end来实现:调用cbegin(c是const的意思),cend:
也可以直接const限制迭代器:
也可以直接使用auto自动推导类型:
void fun(const string& s1)
{
//string::const_iterator its = s1.cbegin();
auto its = s1.begin();
while (its != s1.cend())
{
cout << *its << " ";
its++;
}
}
int main()
{
string num1 = "safdsad";
fun(num1);
return 0;
}
运行效果:
string的构造函数
(3)
(6)
(7)
OK,不再举例。