C++基础(二)

来源:互联网 发布:java工厂方法模式 编辑:程序博客网 时间:2024/06/03 19:26

1.命名空间的using声明</p><p>我们常用的库函数一般都属于命名空间std,我们可以通过域作用符::显式的调用库函数,即如:std::cin
但是使用using声明就无须专门的前缀也能使用所需要的名字了

using namespace::name //声明命名空间中的一个成员using namespace std; //引入整个命名空间

需要注意的是,我们不应该在头文件中使用using声明,这是因为头文件会被包含到其他文件中,会导致一些始料不及的名字冲突。


2.标准库类型string

使用string必须包含string头文件,并引入命名空间std(string定义在这里)

#include<string>using std::string;
string类型的常用定义方式如下,使用“=”的初始化方式称为“拷贝初始化”,使用括号的称为“直接初始化”:
string s1;string s2 = s1;//等价于string s2(s1);string s3 = "zhou"//等价于string s2("zhou");string s4(10,'Y');//仅能用于直接初始化,使用拷贝初始化需要先生成一个临时对象再赋值

getline函数用于读入数据到string中,其参数是一个输入流和毅哥string对象,函数从给定的输入流中读入内容,直到遇到换行符

string s;cin >> s;//读入一段数据,忽略前面的空格getline(cin,s);//原样读入一段数据,直到遇到换行符,该换行符不会被读入

我们都知道size函数可以返回string的长度,但需要注意的是size返回的实际上是一个无符号整型数,因此如果在表达式中混用了带符号数和无符号数可能产生意想不到的结果,即size函数最好别和int类型一起出现在表达式中。

string类型的比较遵循一定的原则,简单来说就是:字符相同比长度,字符不同比第一个不同字符(ASCII码)。

string对象的拼接比C语言中要方便很多:

string s1 = “zhou";string s2 = "shuaiyin";string s3 = s1 + s2; //s3 = ”zhoushuaiyin"string s4 = s1 + "," +s2;//string与字面值常量相加,必须确保“+”号两边至少有一个string对象。

如果我们需要访问string中的单个字符,一般有两种方式,使用下标,另一种是使用迭代器。如果我们想知道某个字符的特性,可以使用cctype头文件中的一组标准函数执行该操作:

isalpha(c); //是否字符isdigit(c); //是否数字isspace(c); //是否空格tolower(c); //输出小写形式touppper(c);//输出大写形式

3.标准库类型vector

使用vector需要引入其定义:

#include<vector>using std::vector;
vector属于模板而非类型,使用vector时必须进行实例化,如vector<int>。vector可以容纳大部分类型的对象,但由于应用不属于对象,因此不可使用引用实例化。但定义vector类型的vector需要在外层vector的右尖括号加入一个空格:

vector<vector<int> >

vector的定义及初始化:

vector<int> ivec;vector<int> ivec2(ivec);vector<int> ivec3 = ivec;

创建指定数量的元素

vector<int> ivec(10,-1);vector<string> svec(10,"hi!");
通常情况下,可以只提供元素数量而不提供初始值,一般会获取一个"值初始化“的元素初值,初值由vector对象的元素类型决定:

vector<int> ivec(10); //初值为0,必须要求类型支持默认初始化(如没有默认构造函数的类)vector<string> ivec(10); //初值为空string

4.数组

默认情况下,数组的元素被默认初始化,和内置类型变量一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值,有如下显式初始化形式:

const unsigned sz = 3;int a1[sz] = { 0, 1, 2};int a2[] = {0 ,1, 2};//数组长度为3int a3[5] = {0 ,1 ,2};int a4[2] ={0, 1, 3};//错误,初始化列表超出定义维度

对于字符数组,我们需要在数组的结尾添加一个空字符,因此其数组长度与整型数组不同:

char a1[] = {'C', '+', '+'};//长度4char a1[] = {'C', '+', '+' , '\0'};//长度4char a1[] = "C++";//长度4char a2[6] = "Daniel"//错误,长度因为7

和vector不同,数组不支持拷贝和赋值:

int a[] = {0, 1, 2};int a2[] = a;//不支持初始化a2 = a;//不支持赋值
和vector一样,数组能存放大部分类型的对象,且可以定义数组本身的指针和引用,但不可定义引用的数组。使用数组的时候编译器一般把它转化成指针,很多用到数组名字的地方,编译器都会自动将其替换为指向数组首元素的指针。

在C++ string类型和C风格的字符串,将string转化为C风格的字符串:

const char *str = s.c_str();
函数的返回结果是一个指针,该指针指向一个以空字符结尾的数组,使用const char*,从而确保我们不会改变数组内容。我们无法保证函数返回的数组一直有效,实际上,如果后续的操作改变了s的值,就可能让先前返回的数组失效,如果想一直使用,最好将该数组重新拷贝一份。


可以使用数组初始化vector:

int a[] ={0, 1, 2, 3,};vector<int> ivec(begin(a),end(a));//使用a数组初始化vector<int> subVec(a+1,a+4);//使用a[1],a[2],a[3]初始化向量









0 0
原创粉丝点击