所有内容均为C++ Primer书中总结,欢迎指出错误
3.1 using声明
using声明可以调用声明其他命名空间中的对象,类。使用方法为
using std::cin;using std::cout;
这样在以后的代码中就可以直接用cin和cout来解决了。
这和python中调包很像
from keras.layers import Dense
注意这里的using声明不是直接使用整个using namespace。
一般不会在头文件中使用using 声明,这样可能会导致一些意想不到的名字冲突。
3.2 标准库类型 string
string类定义在<string>头文件中,定义一个类,需要构建它的 初始化方式以及在这个类上的操作。
对于初始化方式分类拷贝初始化和直接初始化,
string a="daqizi";
string b = a;
string a;
string a("daqizi");
string a(10,'c');
string b(a);
以上的初始化方式,除了第1和2是拷贝初始化之外,其余的全是直接初始化,拷贝初始化就是通过=运算符,将=右边的值拷贝到等号左边.
注意在使用字符字面量初始化string对象时,字符串包含的内容不包括停止符。
string a = "123\0daqizi";
cout<<a;
------
123 输出不会包含后续的daqizi
在这个类上的操作,除了可以通过函数进行操作之外,还可以通过定义运算符的新操作。
比如:
<< >> == = + != 这些在string类中都有定义。
关于输入
string a; cin>>a;//这种输入方式,会忽略掉前置和后置的空格,
//且两个单词之间的空格也不会保留会被当做两个单词一起
std::getline(cin,a)//这种输入方式不会忽略前置和后置的空格
关于size
string a = "123"; a.size()
size()返回的是size_type类型,它肯定是无符号整型,但是具体是什么类型,这是编译器要去处理的事情,我们只需要知道它是无符号类型就可以了。
因为size()返回的是无符号整型,切记无符号整型和有符号整型最好不要混用。
因为如果无符号整型所能表示的数的个数大于有符号整型所能表示的数的个数时(整型题设),
有符号整型会自动的转变为无符号整型,当有符号整型是负数的时候,转变为的无符号整型就很大。
string a="123"; int n=-1;
if (a.size())>n{
cout<<"yes";
}else{
cout<<"no";
} 得到的值是no
string类比较大小是按照字典序来比较,比较的是第一次同一位置相异的字符的大小,这是和长度没有关系的。
string str="z";
string str1 = "abcdefg";
str要大于str1.
如果长度不同,且前面的字符都相等的话,则长度大的字符串要大于长度小的字符串。
如果两个字符串长度一样,且对应位置的字符都是相等的,则两个字符串相等。
关于string对象的相加
string a="123",b="123"; string c = a+b; 这是合法的 +号返回一个新的string对象
string的加号可以和字符字面量和字符串字面量一起混用,但是不能出现+号两边都是字符型或者字符串字面量的情况,因为C++由于历史原因,字符串字面值并不是string对象。
习题
3.2
string a;
while (std::getline(cin,a) ){
//cout << a;
cout << a << endl;
}
string a;
while (cin >> a) {
cout << a << endl;
}
3.3
string的输入运算符会忽略前置和后置的空格,以及两个单词之间的空格
getline不会
3.4
string a, b;
while (cin>>a>>b)
{
cout << a <<" "<< b<<endl;
if (a.size()!=b.size()) {
string temp = (a > b) ? a : b;
cout <<temp <<endl;
}
}
string a, b;
while (cin>>a>>b)
{
cout << a <<" "<< b<<endl;
if (a.size()!=b.size()) {
string temp = (a.size() > b.size()) ? a : b;
cout <<temp <<endl;
}
}
3.5
略O(∩_∩)O
3.2.3 处理string对象中的字符
1. cctype文件中,包含了很多和字符相关的函数,不必硬记。
一般继承自c语言标准库的文件都用c开头,这些函数的命名空间都在std中,一般都使用c开头的头文件。
#include<cctype>
不推荐
#include<ctype.h>
ctype中的函数有
2. 基于范围的for可以遍历序列里面的所有元素
string a = "123asdfb";
for(auto temp:a){
cout<<temp<<endl;
}
这和python里面的for循环方式很像
a:string = "sdlfjksadj"
for temp in a:
print(a)
如果只处理字符串的一部分,则可以使用下标或者迭代器的方式
下标的方式:
下标运算符为[],其接收的参数类型为size_type,对于带符号的值,将自动转为size_type类型。
string a="123312";
a[1]='c'
切记不要越界,不然可能会引发,不可预知的后果
迭代的方式其实就是for循环,加使用下标
string a="12314123";
for(size_type index=0;index!=a.size();++index){
}
为什么使用size_type类型呢,因为size_type类型可以保证,其值永远是正的。所以无需担心其值是否小于0,只需要比较其值是否大于序列的长度。