#define指令把名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义
#ifdef 当且仅当变量已定义时为真
#ifndef 当且仅当变量未定义时为真,一旦检测为真,则执行后续操作知道#endif
字面值:是一个不能改变的值,如数字,字符,字符串等。单引号内的是字符字面值,双引号内的是字符串字面值。
块:名字定义在块内部。名字从声明位置开始直至声明语句所在的作用域末端为止都是可用的。
void*:可以指向任意非常量的指针类型,不能执行解引用操作。
void 类型:是一种特殊用处的类型,既无操作也无值。不能定义一个void类型的变量。
命名空间的using声明
例
#include<iostream>
using std::cin;
int main()
{
int i;
cin>>i;//正确 cin和std::cin含义相同
cout<<i;//错误没有对应的using声明,必须使用完整的名字
std::cout<<i;//正确显示地从std中使用cout
return 0;
}
标准库类型string
定义和初始化string对象
例:
#include<string.h>
using std::string;
int main()
{
string s1;//默认初始化,s1是一个空字符串
string s2=s1;//s2是s1的副本
string s3="hiya";//s3是该字符串字面值的副本
string s4(10,'c');//s4的内容是cccccccccc
return 0;
}
string s3("value") ;//s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3="value";//等价于s3("value");
直接初始化和拷贝初始化
string s5="hiya";//拷贝初始化
string s6=("hiya");//直接初始化
string s7(10,'c');//直接初始化,s7的内容是cccccccccc
当初始值只有一个时,使用直接初始化和拷贝初始化都行,如果像s7有多个值,一般只能使用直接初始化的方式,若要用拷贝初始化,需要显示地创建一个对象用于拷贝
如:string s8=string(10,'c');
等价于:string temp(10,'c');
string s8=temp;
string 的操作:
os<<s 将s写到输入流os中,返回值os
is>>s 从is中读取字符串赋给s,字符串以空白分割,返回is
getline(is,s) 从is中读取一行赋给s,返回is
s.empty() s为空返回true,否则false
s.size() 返回s中字符的个数
s[n] 返回s中第n个字符的引用,位置n从0计起
s1+s2 返回s1和s2连接后的结果
s1=s2 用s2的副本代替s1中原本的字符
s1==s2 如果s1和s2中所含的字符完全相等,string对象的相等性判断对字母大小写敏感
<,<=.>,>= 利用字符在字典里的顺序进行比较,且对字母的大小写敏感
getline 代替>>运算符,读取知道换行符时为止,保留输入的空白符
例:
#include<string.h>
using std::string;
int main()
{
string line;
while(getline(cin,line))
{
cout<<line<<end1;
}
return 0;
}
empty
例:
while(getline (cin,line))
{
if(!=line.empty)
cout<<line<<endl;
}
size
例:
string line;
while(getline(cin,line))
{
if(line.size()>80)
cout<<line<<endl;
}
每次读入一行,输入其中超过80个字符的行
字面值和string对象相加必须确保每个加法运算符的两侧的运算对象至少有一个是string
例:
string s1="hello";
string s4=s1+",";//正确
string s5="hello"+","//错误两个运算对象都不是string
处理string对象中的字符
isalnum(c) 当c是字母或数字时为真
isalpha(c) 当c是字母时为真
iscntrl(c) 当c是控制字符时为真
isdigit(c) 当c是数字时为真
isgraph(c) 当c不是空格但是可以打印时为真、
islower(c) 当c是小写字母时为真
isprint(c) 当c是可打印字符时为真(即c是空格或具有可视形式)
ispunct(c) 当c是标点符号时为真
isspace(c) 当c是空白时为真
isupper(c) 当c是大写字母时为真
isxdigit(c) 当c是大写字母时为真
tolower(c) 如果c是大写字母,输出对应的小写字母,否则原样输出
toupper(c) 如果c是小写字母,输出对应的大写字母,否则原样输出
对string对象的每个字符进行处理
for(declaration,expression)
statment;//expession是一个对象declaration负责定义一个变量
例:
string str("some string");
for(auto c:str)//对于str中的每个字符
cout<<c<<endl;//输出当前字符,后面紧跟一个换行符
只处理一部分字符用下标运算符[]
例
if(!s_empty)
cout<<s[0]<<endl;
标准库类型vector表示对象的集合,其中所有的对象类型都相同
#include<vector>
using std::vector;
初始化vector对象的方法
vector<T>v1 v1是一个空vector,它潜在的元素是T类型,执行默认初始化
vector<T>v2(v1) v2中包含v1中所有元素的副本
vector<T>v2=v1 等价于v2(v1)
vector<T>v3(n,val) v3包含了n个重复元素,每个元素的值都是val
vector<T>v4(n) v4包含了几个重复执行了值初始化的对象
vector<T> v5{a,b,c.....} v5 包含了初始值个数的元素,每个元素都赋予相应值
vector<T>={a,b,c.... } 等价于v5{a,b,c....}
vector<int> ivec://初始状态为空
vector<int> ivec2(ivec);//把ivec的元素拷贝给ivec2
vector<int> ivec3=ivec;//把ivec的元素拷贝给ivec3
vector<string> svec(ivec2);//错误,svec的元素是string对象,不是int
vector 对象的列表初始化
vector <string> articles={"a","b","c"};//列表初始化
vector <string> articles=("a","b","c");//错误
vector<int> ivec(10);//10个元素,每个都初始化为0
vector<string> svec(10);//10个元素,每个都是空string对象
限制:有些必须提供初始值,若元素的类型不支持默认初始,我们必须提供初始的元素值。如果提供了元素的数量而没设定初始值,只能使用直接初始化
赋初始值使用的是圆括号,可以说提供的值是用来构造vector对象的
大括号可以表述成我们想列表初始化该vector对象
例
vector<int> v1(10,1);//v.有10个元素,每个值都是1
vector<int> v2{10,1};//v2有两个元素,值分别是10和1
push_back添加元素成员函数
例
vector <int> v2 ;
for(int i=;i!=;++i)
v2.push_back(i)//依次把整数放到v2尾端
其他vector操作
v.emptcy() 如果v不含任何元素,返回真,否则假
v.size 返回v中元素的个数
v.push_back(t) 向v的尾端添加一个元素,值为t
v[n] 返回v中第n个位置上的元素引用
v1=v2 用v2中元素的拷贝替换v1中的元素
v1={a,b,c....} 用列表中元素的拷贝替换v1中的元素
v1==v2 v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同
v1!=v2
<,<=,>,>= 以字典顺序比较