第三章
1
using namespace::name
使用命名空间的名字。
例如:using std:cin
每个名字都需要独立的using
声明。
头文件不应该使用using
,否则所有引用头文件的文件都会有这个声明。
2
=
是拷贝初始化
()
是直接初始化
3
String
的操作有getline(is,s)
:读取一行,但不包括换行符。
string str='b'+'c'+s1
是不合法的,不能将字面值直接相加。
string str=s1+'b'+'c'
是合法的。
4
如果要对字符修改:
for(auto &c:s){
c = toupper(c);
}
cout<<s<<endl;
5
String
的下标是string::size_type
的,如果传进来的是带符号则会自动转换。
6
7
vector
是类模板;
类型不一样,无法进行列表初始化的时候会当做默认值初始化:例如元素个数
{
n
}
\{n\}
{n},和
{
n
,
v
a
l
}
\{n,val\}
{n,val}
8
9
begin
和end
返回迭代器的类型与元素类型一致。
cbegin
和cend
则都是cosnt_iterator
10
i
t
−
>
m
e
n
it->men
it−>men等价于
(
∗
i
t
)
.
m
e
n
(*it).men
(∗it).men
任何一种可能改变
v
e
c
t
o
r
vector
vector容量的操作,都会使得其迭代器失效。
两个迭代器之间的距离的类型是
d
i
f
f
e
r
e
n
c
e
_
t
y
p
e
difference\_type
difference_type的带符号整型数。
11
数组声明的时候必须是常量表达式为初始值的常量(即编译就能得到结果)。
12
字符数组的初始化:
13
复杂数组的声明
数组声明从内到外读。
14
使用数组下标的时候,通常定义为
s
i
z
e
_
t
size\_t
size_t类型
对于
A
A
A是数组:
d
e
c
l
t
y
p
e
(
A
)
decltype(A)
decltype(A)仍是数组,
a
t
u
o
B
(
A
)
atuo B(A)
atuoB(A)则是指针
获取数组的起始指针和尾后指针:
int *beg=begin(A);int *last=end(A);
int *end=&A[sz]
是合法的但是危险的,但是&A[sz+100]
显然不合法的
两个指针相减的结果为:`ptrdiff_t
15
C
C
C风格字符串必须以空字符结尾。
strlen
会不断寻找。
strcpy
和strcat
需要保证空间够,这就是代码充满风险的原因。
16
C
风格字符串到string
反过来:
数组初始化vector
:
17
利用范围for
处理多维数组
for(auto &row : ia){
for(auto &col : row){
col = cnt++;
}
}
第一层是引用的原因是 row
是数组,所以可能会被转换成指针,而如果是指针的话第二次for
就不合法了,所以无论第二次是否修改,第一层都应该是引用。
18
对于
i
a
[
3
]
[
4
]
ia[3][4]
ia[3][4],对其进行遍历:
或者: