您的位置:首页 > 其它

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

2016-02-01 18:55 429 查看

QVector和vector的比较:

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()才检查越界。

构造函数:

Vector的构造函数C++98版:

explicitvector(constallocator_type&alloc=allocator_type());

explicitvector(size_typen,constvalue_type&val=value_type(),

constallocator_type&alloc=allocator_type());

template<classInputIterator>

vector(InputIteratorfirst,InputIteratorlast,

constallocator_type&alloc=allocator_type());

vector(constvector&x);

C++11版:

explicitvector(constallocator_type&alloc=allocator_type());

explicitvector(size_typen);

vector(size_typen,constvalue_type&val,

constallocator_type&alloc=allocator_type());

template<classInputIterator>

vector(InputIteratorfirst,InputIteratorlast,

constallocator_type&alloc=allocator_type());

vector(constvector&x);

vector(constvector&x,constallocator_type&alloc);

vector(vector&&x);

vector(vector&&x,constallocator_type&alloc);

vector(initializer_list<value_type>il,

constallocator_type&alloc=allocator_type());

Qvector的构造函数:

QVector::QVector()

QVector::QVector(intsize)

QVector::QVector(intsize,constT&value)

QVector::QVector(constQVector<T>&other)

QVector::QVector(std::initializer_list<T>args)

通过比较我们发现,vector可以指定内存分配器,而且Qvector少了类似template<classInputIterator>

vector(InputIteratorfirst,InputIteratorlast,构造函数。所以以下代码是肯定不行的:

QVector<int>second(4,100);

QVector<int>third(second.begin(),second.end());

intmyints[]={16,2,77,29};

QVector<int>fifth(myints,myints+sizeof(myints)/sizeof(int));


迭代器:

Vector迭代器beginC++98版本:

iteratorbegin();

const_iteratorbegin()const;

C++11版:

iteratorbegin()noexcept;

const_iteratorbegin()constnoexcept;

noexcept指定这两个函数是不能抛出异常的。


Vector迭代器endC++98版本:

iteratorend();

const_iteratorend()const;

C++11版:

iteratorend()noexcept;

const_iteratorend()constnoexcept;


Vector迭代器rbeginC++98版本:

reverse_iteratorrbegin();

const_reverse_iteratorrbegin()const;

C++11版:

reverse_iteratorrbegin()noexcept;

const_reverse_iteratorrbegin()constnoexcept;

noexcept指定这两个函数是不能抛出异常的。


Vector迭代器rendC++98版本:

reverse_iteratorrend();

const_reverse_iteratorrend()const


C++11版:

reverse_iteratorrend()noexcept;

const_reverse_iteratorrend()constnoexcept;

常量迭代器只要C++11版本的:

const_iteratorcbegin()constnoexcept;

const_iteratorcend()constnoexcept;

const_reverse_iteratorcrbegin()constnoexcept;

const_reverse_iteratorcrend()constnoexcept;

Qvector的迭代器:

iterator

begin()

const_iterator

begin()const

const_iterator

constBegin()const

const_iterator

constEnd()const

iterator

end()

const_iterator

end()const

Qvector没有反向迭代器。


Vector有而Qvector没有的函数或功能:

size_typemax_size()const;

返回vector可以存在最大元素个数。

voidshrink_to_fit();这个函数是C++11独有的

使得vector减少其容量为适合大小的容量。

赋值函数:

C++98:

template<classInputIterator>

voidassign(InputIteratorfirst,InputIteratorlast);

voidassign(size_typen,constvalue_type&val);

C++11:

template<classInputIterator>

voidassign(InputIteratorfirst,InputIteratorlast);

voidassign(size_typen,constvalue_type&val);

voidassign(initializer_list<value_type>il);

下面两个函数其实跟insert差不多

template<class...Args>

iteratoremplace(const_iteratorposition,Args&&...args);


template<class...Args>

voidemplace_back(Args&&...args);



Qvector有而vector没有的函数:

intQVector::count(constT&value)const

返回Qvector中值为value的个数。

boolQVector::contains(constT&value)const

判断Qvector中是否包含元素value,要求Qvector中的类型必须支持比较操作==

boolQVector::endsWith(constT&value)const

判断Qvector中是否以value值结尾。

intQVector::indexOf(constT&value,intfrom=0)const

intQVector::lastIndexOf(constT&value,intfrom=-1)const

QVector<T>QVector::mid(intpos,intlength=-1)const

voidQVector::squeeze()

该函数释放不用的内存,类似于vector的voidshrink_to_fit()


boolQVector::startsWith(constT&value)const


QList<T>QVector::toList()const

std::vector<T>QVector::toStdVector()const

QVector<T>QVector::fromList(constQList<T>&list)[static]

QVector<T>QVector::fromStdVector(conststd::vector<T>&vector)[static]


boolQVector::operator!=(constQVector<T>&other)const

QVector<T>QVector::operator+(constQVector<T>&other)const

QVector<T>&QVector::operator+=(constQVector<T>&other)

QVector<T>&QVector::operator+=(constT&value)

QVector<T>&QVector::operator<<(constT&value)

QVector<T>&QVector::operator<<(constQVector<T>&other)

QVector<T>&QVector::operator=(constQVector<T>&other)

boolQVector::operator==(constQVector<T>&other)const
'target='_blank'>http://blog.csdn.net/hai200501019/article/details/11713519[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: