QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)

QVector和vector的比较:

https://www.cnblogs.com/findumars/p/5176062.html

Qvector默认使用隐式共享,可以用setSharable改变其隐式共享。使用non-const操作和函数将引起深拷贝。at()比operator[](),快,因为它不进行深拷贝.Qvector取值都会检查越界问题。

看看简单的例子:

QVector<int>  vecA;

QVector<int>  vecB;

vecA.push_back(1);

vecA.push_back(10);

 

       vecB= vecA;    

 

       cout<<"&vecA.at(0) : "<<&vecA.at(0)<<endl;

       cout<<"&vecB.at(0) : "<<&vecB.at(0)<<endl;

 

 

QVector<int>  vecC;

vecA.setSharable(false);

vecC = vecA;

cout<<"&vecA.at(0): "<<&vecA.at(0)<<endl;

cout<<"&vecC.at(0): "<<&vecC.at(0)<<endl;

 

 

对比发现,禁用了隐式共享之后,元素的地址就不再一样了。

 

Vector

Vector没有隐式共享,operator [ ]不检查越界,at()才检查越界。

 

#include <QCoreApplication>
#include <QVector>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    {
        QVector<int>  vecA;
        QVector<int>  vecB;
        vecA.push_back(1);
        vecA.push_back(10);
        vecB= vecA;
        cout<<"&vecA.at(0) : "<<&vecA.at(0)<<endl;
        cout<<"&vecB.at(0) : "<<&vecB.at(0)<<endl;
        cout<<"vecA.at(0) : "<<vecA.at(0)<<endl;
        cout<<"vecB.at(0) : "<<vecB.at(0)<<endl;
        vecA[0]=5;
        cout<<"vecA.at(0) : "<<vecA.at(0)<<endl;
        cout<<"vecB.at(0) : "<<vecB.at(0)<<endl;
        cout<<"&vecA.at(0) : "<<&vecA.at(0)<<endl;
        cout<<"&vecB.at(0) : "<<&vecB.at(0)<<endl;
    }
    cout<<"------------------------------"<<endl;
    {
         QVector<int>  vecA;
         vecA.push_back(1);
         vecA.push_back(10);
         QVector<int>  vecC;
         vecA.setSharable(false);
         vecC = vecA;
         cout<<"&vecA.at(0): "<<&vecA.at(0)<<endl;
         cout<<"&vecC.at(0): "<<&vecC.at(0)<<endl;
         cout<<"vecA.at(0): "<<vecA.at(0)<<endl;
         cout<<"vecC.at(0): "<<vecC.at(0)<<endl;
         vecA[0]=5;
         cout<<"vecA.at(0) : "<<vecA.at(0)<<endl;
         cout<<"vecC.at(0) : "<<vecC.at(0)<<endl;
         cout<<"&vecA.at(0): "<<&vecA.at(0)<<endl;
         cout<<"&vecC.at(0): "<<&vecC.at(0)<<endl;
    }
    return a.exec();
}

 

&vecA.at(0) : 000E9A80
&vecB.at(0) : 000E9A80
vecA.at(0) : 1
vecB.at(0) : 1
vecA.at(0) : 5
vecB.at(0) : 1
&vecA.at(0) : 000E9AD0
&vecB.at(0) : 000E9A80
------------------------------
&vecA.at(0): 000E9AD0
&vecC.at(0): 000E1D90
vecA.at(0): 1
vecC.at(0): 1
vecA.at(0) : 5
vecC.at(0) : 1
&vecA.at(0): 000E9AD0
&vecC.at(0): 000E1D90

 

posted @ 2018-04-18 16:06  sky20080101  阅读(217)  评论(0)    收藏  举报