数组的大小:size_t //<cstddef>头
数组不是类,因此没有成员(例如:size_type), size_t作为一个更普遍的类型,可(bi)以(xu)用来表示数组的大小。
数组用于标准库算法
假设a是一个具有n个元素的数组,v是一个向量,那么将a用于标准库算法时,应用 a 和 a + n 替代 v.begin() 和 v.end()。
a + n 虽然超出了数组的范围,但这一地址是有效的。
//e.g. copy a to v
copy ( a, a + n, back_inserter(v) );
//construct v by a
vector<int> v(a, a + n);
strlen() //<cstring>头
strlen函数不计算最后的 '\0'。一种可能的实现:
1
2
3
4
5
6
7
|
size_t
strlen
(
const
char
* p )
{
size_t
size = 0;
while
( *p++ !=
'\0'
)
++size;
return
size;
}
|
获取数组的长度
std::size_t n = sizeof( a ) / sizeof( *a );
static
如果一个函数会被多次调用,函数中那些const类型且每次调用都不变化变量可以生命为static的。这样在多次调用该函数时仅会在第一次调用时初始化这些变量。这使程序更高效。
//e.g.
static const int week[] = {1, 2, 3, ,4, 5, 6, 7};
main的两个参数
第二个参数是一个指向一个指针数组的指针
第一个参数是第二个参数指向的指针数组的指针个数。
int main( int agc, char** argv )
ifstream / ofstream //<fstream>头
一个例子:将in.txt内容复制到out.txt中
1
2
3
4
5
6
7
8
9
10
|
int
main()
{
std::string instr =
"F:\\in.txt"
;
std::ifstream infile(instr);
std::ofstream outfile(
"F:\\out.txt"
);
std::string s;
while
(std::getline(infile, s))
outfile << s << std::endl;
return
0;
}
|
static & dynamic
0.
int* invalid_pointer()
{
int x;
return &x;
} //错误,函数结束时x的内存被释放,返回的指针是无效的。
1.
int* point_to_static ()
{
static int x;
return &x;
} //x是static的,程序结束时才会释放x的内存,因此该函数每次返回指向同一个对象的指针。
2.
int* point_to_dynamic ()
{
return new int(0);
} //动态分配的对象会一直存在,直到delete。本函数每次返回指向一个新对象的指针。
数组内存的动态分配
T* p = new T[n]; //对数组进行默认初始化,即①内部类型+局部作用域→不初始化;②类→默认构造函数初始化
delete[] p;