QVector 和vector的比较
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版:
explicit vector (const allocator_type& alloc = allocator_type());
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
vector (const vector& x);
C++11版:
explicit vector (const allocator_type& alloc = allocator_type());
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
vector (initializer_list<value_type> il,
const allocator_type& alloc = allocator_type());
Qvector的构造函数:
QVector::QVector ()
QVector::QVector ( int size )
QVector::QVector ( int size, const T & value )
QVector::QVector ( const QVector<T> & other )
QVector::QVector ( std::initializer_list<T> args )
通过比较我们发现,vector可以指定内存分配器,而且Qvector少了类似template <class InputIterator>
vector (InputIterator first, InputIterator last,构造函数。所以以下代码是肯定不行的:
QVector<int> second (4,100);
QVector<int> third (second.begin(),second.end());
int myints[] = {16,2,77,29};
QVector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
迭代器:
Vector迭代器begin C++98版本:
iterator begin();
const_iterator begin() const;
C++11版:
iterator begin() noexcept;
const_iterator begin() const noexcept;
noexcept指定这两个函数是不能抛出异常的。
Vector迭代器end C++98版本:
iterator end();
const_iterator end() const;
C++11版:
iterator end() noexcept;
const_iterator end() const noexcept;
Vector迭代器rbegin C++98版本:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
C++11版:
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
noexcept指定这两个函数是不能抛出异常的。
Vector迭代器rend C++98版本:
reverse_iterator rend();
const_reverse_iterator rend() const
C++11版:
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;
常量迭代器只要C++11版本的:
const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
const_reverse_iterator crbegin() const noexcept;
const_reverse_iterator crend() const noexcept;
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_type max_size() const;
返回vector可以存在最大元素个数。
void shrink_to_fit(); 这个函数是C++11独有的
使得vector减少其容量为适合大小的容量。
赋值函数:
C++98:
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);
C++11:
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);
void assign (initializer_list<value_type> il);
下面两个函数其实跟insert差不多
template <class... Args>
iterator emplace (const_iterator position, Args&&... args);
template <class... Args>
void emplace_back (Args&&... args);
Qvector有而vector没有的函数:
int QVector::count ( const T & value ) const
返回Qvector中值为value的个数。
bool QVector::contains ( const T & value ) const
判断Qvector中是否包含元素value,要求Qvector中的类型必须支持 比较操作==
bool QVector::endsWith ( const T & value ) const
判断Qvector中是否以value值结尾。
int QVector::indexOf ( const T & value, int from = 0 ) const
int QVector::lastIndexOf ( const T & value, int from = -1 ) const
QVector<T> QVector::mid ( int pos, int length = -1 ) const
void QVector::squeeze ()
该函数释放不用的内存,类似于vector的void shrink_to_fit()
bool QVector::startsWith ( const T & value ) const
QList<T> QVector::toList () const
std::vector<T> QVector::toStdVector () const
QVector<T> QVector::fromList ( const QList<T> & list ) [static]
QVector<T> QVector::fromStdVector ( const std::vector<T> & vector ) [static]
bool QVector::operator!= ( const QVector<T> & other ) const
QVector<T> QVector::operator+ ( const QVector<T> & other ) const
QVector<T> & QVector::operator+= ( const QVector<T> & other )
QVector<T> & QVector::operator+= ( const T & value )
QVector<T> & QVector::operator<< ( const T & value )
QVector<T> & QVector::operator<< ( const QVector<T> & other )
QVector<T> & QVector::operator= ( const QVector<T> & other )
bool QVector::operator== ( const QVector<T> & other ) const
QVector 和vector的比较的更多相关文章
- QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)
QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快, ...
- QVector<QString> 显示器里面的动态数组元素QString和char *转变
QVector类是一类提供了动态数组模板. QVector<T>是Qt普通容器类的一种. 它将自己的每个对象存储在连续的内存中.能够使用索引號来高速訪问它们.QList<T>. ...
- 获取一个数组(vector)与查找值(value)的差最小绝对值的成员索引的算法
代码如下: 函数作用:传递进来一个数组(vector),和一个需要查找的值(value),返回与value的差值绝对值最小的vector成员索引,若value不在vector范围中,则返回-1: in ...
- Qt之Concurrent框架
简述 QtConcurrent命名空间提供了一个高级API来编写多线程程序,而无需使用低级线程原语,例如:互斥.读写锁.等待条件或信号量.使用QtConcurrent编写的程序使用的线程数量会自动根据 ...
- C++中的容器类详解
一.STL容器类 STL(Standard Template Library)的六大组件:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- Qt Thread
Threading Classes (Qt help manual key words) These Qt Core classes provide threading support to appl ...
- Understand the Qt containers(有对应表)
Container classes are one of the cornerstones of object-oriented programming, invaluable tools that ...
- qwt
一. 1.下载地址https://sourceforge.net/projects/qwt/ 2.注意:官方提供qt安装包creator都是用MSVC编译(包括mingW版)的,所以Creator的插 ...
- Qt4与Qt3的主要不同
Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...
随机推荐
- ubuntu远程windows服务器
ubuntu端: sudo apt-get install rdesktop windows端: 需要允许此windows远程访问.我的windows是windows server2012,基本操作: ...
- .net mvc下的Areas和小写Url
首先是一个站点有前台后台两部分,这个要怎么来做.可以在mvc项目中添加区域(Areas)来实现,当添加一个名为Admin的区域时,项目下多了一个Areas/Admin目录,里边有Controllers ...
- 3.19 外协加工(通过BOM体现加工物料总成本,非系统标准工序外协功能)
3.19.1 业务方案描述 对每一个外协加工产品定义对应的加工费项目,并将发外加工物料及加工费项目一起挂在加工后产品的BOM下(供应类型为装配拉式). 加工后产品的成本按外协BOM卷积,总成本包含 ...
- 在 Windows Azure 虚拟机中如何备份和还原 Windows 系统磁盘
备份和还原对于操作真实的系统来说至关重要.对于 Windows Azure 虚拟机环境中的 Windows Server,可以根据自身的需求选择多种不同的工具或将这些工具结合使用来实现备份.下面将对这 ...
- csu 1563 Lexicography
题意:给出一堆字母 问这些字母组成的字符串中第k大的 排列组合,具体看代码 //寒假集训被何柱大大踩好惨(>_<) #include<cstdio> #include<i ...
- [Leetcode][Python]35: Search Insert Position
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 35: Search Insert Positionhttps://oj.le ...
- XMPP安装中遇到需要卸载openfire的步骤
首先,确保你已经关掉了openfire打开终端 (在应用程序—>实用工具—>)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.pre ...
- Android入门第十六篇之Style与Theme [转]
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.. ...
- SPDY HTTP2.0
SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验.SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强 ...
- 关于ajax的那些事
什么是ajax AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. Ajax包含下列技术:基于 ...