Chapter 3
头文件:<ios>
类型:std::streamsize
头文件:<iomanip>
控制器:std::setprecision 设置输出的有效位数
例:
1
2
|
//获得原精度
streamsize prec = cout.precision();
|
1
2
3
4
|
//设置输出3位有效位,如:86.3
cout <<
"Your final grade is "
<< setprecision(3)
<< 0.2 * midterm + 0.4 * final + 0.4 * sum / count
|
也可以只使用precision()方法:
1
2
3
4
5
6
|
//把精度设置为3,返回原先精度
streamsize prec = cout.precision(3);
cout <<
"Your final grade is "
<< 0.2 * midterm + 0.4 * final + 0.4 * sum / count << endl;
//设置回原先值
cout.precision(prec);
|
Precision : 精密,精确
Chapter 4
左值
L-value, 表示可以放在=左边的值,也可以理解为是具有可寻址内存空间的值(L:location)。也存在只读左值,比如const类型的变量,这 是不能放在等号左边的。非常量引用和++也要求操作数为左值。
R-value 是不可写的,一般是临时对象,也可以理解为read value。
1
2
3
|
//常量引用可以引用右值
const
int
& ci = 200;
cout << ci;
|
clear()
作为istream的成员,它清楚所有的错误标记以使输入动作可以继续;
作为vector的成员,它删除其中的全部成员使之成为一个空的向量。
size_type
存放string的长度?请使用:string::size_type
1
|
string::size_type len = name.size();
|
setw()
控制紧接着的输出的格式,对下一个输出填充一些空格。
//<iomanip>
1
2
|
std::cout << 0 << std::setw(5) << 1 << 0 << std::endl;
//0 10
|
想要左对齐?
1
|
cout.flags(std::ios::left);
|
更多流控制器:http://www.cplusplus.com/reference/iomanip/
更多flags:http://www.cplusplus.com/reference/ios/
函数的独立
为了组织程序,可以将每一个/几个函数定义独立放到一个单独的文件中(main.cpp能怎么用,函数.cpp就能怎么用),并有一个对应的头文件放 函数声明。(以及类的声明)
头文件中的using声明会using到每一个包含它的程序中,因此在头文件中最好不要使用using声明。
#ifndef最好位于文件的第一行,就算是注释也不能放它前面。
Chapter 5
vector.erase()
要注意使用后vector.size()会变化,因此如果是在循环中使用每次应重新计算vector.size()
同理vector.end()也应重新获取。
使用迭代器进行随机访问
1
2
|
if
( students[i].grade < 60 )
students.erase( students.begin() + i );
|
(不支持随机访问的容器类型不允许这种操作,不过仍允许使用迭代器顺序访问)
//如果将students类型由vector改为list,则编译不能通过
i是 int 型?NO!
1
|
vector<Student_info>::size_type i = 0
|
完全使用迭代器的版本:
1
2
3
4
5
6
|
if
( (*iter).grade < 60 )
iter = students.erase( iter );
//vector.erase()将使指向被删元素和该元素后面元素的迭代器失效(而list.erase()仅会使指向被删元素的迭代器失效,其后元素的位置并未变化,因此迭代器不失效)
//同时返回指向被删元素后面那个元素的迭代器。
//如果将students类型由vector改为list,该代码不需任何变化
|
vector.push_back() 使所有指向这个vector的迭代器失效
vs
list.push_back() 不会使指向其他元素的迭代器失效
自备sort()
list 不支持完全随机的访问,不能使用标准库中的sort()函数:
1
|
students.sort( compare );
|
<cctype>头
对字符进行分类和变换的函数集合。
std::isspace( c );
更多函数:http://www.cplusplus.com/reference/cctype/
str.substr( i, n );
注意这里 n 指长度
//复制str中半开区间 [ i, j )所表示的字符到s
s = str.substr( i, j - i );
(从 i 开始复制 j - i 个字符)
vector<string>的纵向连接
1
2
3
|
ret.insert ( ret.end(), bottom.begin(), bottom.end() );
//对于vector容器,insert()与push_back()一样,都可能引起内存的重新分配,因此使所有迭代器失效。
|
而当使用了失效了的迭代器时亲测是出现了下图所示情况: