QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)
2016-02-01 18:55
429 查看
QVector和vector的比较:
Qvector默认使用隐式共享,可以用setSharable改变其隐式共享。使用non-const操作和函数将引起深拷贝。看看简单的例子:
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 |
|
const_iterator |
|
const_iterator |
|
const_iterator |
|
iterator |
|
const_iterator |
|
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]
相关文章推荐
- nrf51822自学笔记(三)心率计
- 保护Android resources文件不被反编译原理分析
- android *** Layout 10 DatePicker && TimePicker
- 首次使用git配置说明
- vim用法详解
- Qt实现不同Treewidget之间拖拽
- maven工程小红叉处理方法
- gitlab添加用户
- 集成学习总结
- Hello World--------------LeapMotion API新建一个程序
- Qt实现QQ好友下拉列表(用QListView实现,所以还得定义它的Model)
- ZOJ 3875 LunchTime
- 基于spark机器学习---------物品推荐demo
- Gitlab客户端安装(for windows x64)
- 文件保存树形结构数据
- javac java在mac console中文乱码的问题
- Android自定义View控件
- Java环境的配置
- 用PHP写出显示客户端IP与服务器IP的代码
- [iPhone硬件]-GPS定位的使用