3.1命名空间的using声明
头文件不应该包含using声明
头文件的内容会被拷贝到所有引用它的文件中去,如果头文件里面有某个using声明,那么每个使用了该头文件的文件就都会有这个声明。对于某些程序来说,由于不经意包含了一些名字,反而可能产生始料未及的名字冲突。
3.2标准库类型 string
3.2.1定义和初始化string对象
string s1;//空字符串
string s2=s1;//拷贝操作符
string s3="hiya";
string s4(10,'c');
直接初始化和拷贝初始化
string s5="hiya";//拷贝初始化
string s6("hiya");//直接初始化
string s7(10,'c');//直接初始化
读写string对象
string对象会自动忽略开头的空白(空格换行制表)从第一个字符开始
使用getline读取一整行
int main()
{
string line;
while(getline(cin,line))
cout<<line<<endl;
return 0;
}
string::size_type类型
string的size函数返回的是一个string::size_type类型的值。
字面值和string对象相加
string对象和字面值相加的时候必须确保运算符两侧的运算对象至少有一个是string对象,必须有一方有操作符重载
cctype头文件判断字符的函数![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b536bc2cfffba48fc61ae7cb789a331c.png)
3.3标准库类型vector
vector属于类模板,编译器根据类模板创建类或函数的过程称为实例化
3.3.1 定义和初始化vector对象
vector<T> v1
vector<T> v2(v1)
vector<T> v2 = v1
vector<T> v3(n,val)
vector<T> v4(n)
vector<T> v5{a,b,c...}
vector<T> v5={}
3.4迭代器
迭代器类型
vector<int>::iterator it;//可读可写
vector<int>::const_iterator it2;//只读
3.5数组
3.5.1定义和初始化内置数组
- 数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的。
- 定义数组必须制定数组的类型,不允许使用auto关键字
- 不允许拷贝和赋值
int *ptrs[10];//ptrs是指向10个int型指针的数组
int &refs[10];//没有指向引用的数组
int (*Parray)[10]=&arr;//parry指向一个含有10个整数的数组
int (&arrRef)[10]=arr;//arrRef引用一个含有10个整数的数组
3.5.2访问数组元素
数组下标:一般使用size_t类型
size_t一般是一种机器相关的无符号类型,被设计的足够大以便能表示内存中任意对象的大小。
3.5.3指针和数组
标准库函数begin和end(iterator头文件中)
并不是成员函数,正确的使用形式是将数组作为他们的参数
int ia[]={0,1,2,3,4,5,6,7,8,9};
int *beg=begin(ia);
int *end=end(ia);
3.5.4 C风格的字符串
strlen(p)//返回p的长度,空字符不计算
strcmp(p1,p2)//比较p1和p2的相等性,如果==返回0,如果p1>p2返回正值,如果p1<p2返回一个负值
strcat(p1,p2)//将p2附加到p1后面,返回p1
strcpy(p1,p2)//将p2拷贝给p1,返回p1
3.5.5 与旧代码的接口
string类型转换为c风格字符串
string s("hello world");
char *str=s;//错误,不能直接用string对象初始化char*
const char * str=s.c_str();//正确
使用数组初始化vector对象
不允许使用数组为另一个数组赋初值;
不允许使用vector为另一个数组赋初值;
允许使用数组为vector赋初值;
int int_arr[]={0,1,2,3,4,5};
vector<int>ivec(begin(int_arr),end(int_arr));
//也可以是数组的一部分
vector<int>ivec1(int_arr,int_arr+3);
typedef类型别命简化多维数组指针
using int_array=int[4];//新标准下类型别名的声明
typedef int int_array[4];//等价的typedef声明