c++随笔——17.10.18

来源:互联网 发布:福建星云大数据公司 编辑:程序博客网 时间:2024/06/16 15:06

一.容器vector的初始化

1.数组的习惯用法

Vector<int> vec(5); //定义了一个容器,长度为5,值都为0,默认

Vector<int> vec(5,-1); //定义了一个容器,长度为5,值都为-1,设定

 

Int a[]={1,2,3,4,5};

Vector<int> vec(a,a+5); //定义了一个容器,长度为5,值为12345

//传递的是数组的首末地址,这里的a为地址

Vector<int> vec(a+1,a+2);   //所以我们也可这么写,长度为2,值为23

 

2. STL的习惯用法

赋值法:

Vector可以被另一个vector初始化或被赋给另一个vector

Vector<int> vec1;

Vector<int> vec2(vec1); //初始化

Vec3 = vec1; //赋值

 

插入元素进行赋值,使用push_back()函数

*tipsvector<int> vec;会声明一个空的容器,即长度为0,所以此时无法使用

下标访问,也就是说使用下标赋值也不行,似乎进入死循环了,所以我们该使用

Push_back()这个函数,添加一个地址,并为此地址赋值。但是,也就说明

此函数不能像下标那样替换某一位置的值了。

Eg

Vector<int> vec;

Vec.push_back(1); //vec[0] ==== 1

Vec.push_back(2); //vac[1] ====2

Vec.size; //长度为2

 

3使用迭代器访问容器

Vector<int> vec(vec1);

 

For(vector<int>::iterator it = vec.begin();

It != vec.end();

++it)

{

...

}

 

关于迭代器的使用:

vector<int> iterator it = vec.begin();

定义了一个迭代器,他就是一个迭代器的一个类型,虽然类似于指针,但是并不能与

指针进行运算,能取址,需要加上&号,迭代器相差的距离是看你是什么类型的容器,

在本例中,是Qt5.6的运行环境,win104个字节长度的地址。还有,迭代器之间不能

进行运算。也就是itx = ity + itx;也许是没有重载这个+运算符 。

容器:

他不像数组那样,作为函数的参数时,传递数组的首地址,就可以对数组在外域中产生改变,

也就是

Sort(int a[]); //在此函数中发生的变化,也保留到调用此函数的作用域中

Sort(vector<int> vec); //如果想和数组相同的效果,则需要加取址符&,即

Sort(vector<int> &vec);

 

 

生命周期

不要在子域中传递即将要销毁的变量的别名或者地址,因为你传回到外域时,整好是子域的结束,编译器将销毁在子域中声明的变量,此时你的地址是存在的,但是你地址上的值是不同的,也可能会造成野指针,后果很严重。

 

Reference point

Reference必须代表某个对象,即不能为“空”

Point可以为空,即null

使用结果上大致相同。

 

默认值的使用

Point可以有空,而reference必须有值,所以在使用默认值设置为0的时候应改为point,即:

Display(vector<int> *vec = 0);

如果是其他的默认值reference也可以胜任

Display(const vector<int> &vec,ostream &os = cout);//默认为文件流输出的模式

其中,默认值有规则:

1,默认值的决议从最右边开始进行,即在我选定了某一个参数为默任值,则他的右侧必须都有默认值,不然则为非法。

2,默认值只能选定一次,即在函数的声明和定义中,仅能出现在一个地方,不然则会报错,而一般声明又写在头文件中,在cpp文件调用头文件的时候会链接他的库,所以头文件的可见性更高,所以我们为了获得更高的可见性,我们一般把其默认值放置在头文件中,也就是声明当中。

原创粉丝点击