一.容器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,值为1,2,3,4,5
//传递的是数组的首末地址,这里的a为地址
Vector<int> vec(a+1,a+2); //所以我们也可这么写,长度为2,值为2,3
2. STL的习惯用法
赋值法:
Vector可以被另一个vector初始化或被赋给另一个vector
Vector<int> vec1;
Vector<int> vec2(vec1); //初始化
Vec3 = vec1; //赋值
插入元素进行赋值,使用push_back()函数
*tips:vector<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的运行环境,win10,4个字节长度的地址。还有,迭代器之间不能
进行运算。也就是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文件调用头文件的时候会链接他的库,所以头文件的可见性更高,所以我们为了获得更高的可见性,我们一般把其默认值放置在头文件中,也就是声明当中。