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的迭代器:
|
|
|
|
|
|
|
|
|
|
|
|
- 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版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...
随机推荐
- sqlite3编译与查询
1.sqlite3 http://www.sqlite.org/ 下载 wget http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip ...
- NOI2015 Day2
NOI2015 Day2 荷马史诗 题目描述:给出\(n\)个数,要求\(n\)个\(k\)进制数来对应这\(k\)个数(允许有前导零),\(n\)个\(k\)进制数互不为前缀,求\(n\)个数乘以对 ...
- poj1543---完美立方(枚举)
#include <stdio.h> #include <stdlib.h> int main() { int cube[101],n,i,a,b,c,d; for(i=1;i ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(四)
通过前面的操作,我们已经可以创建一个带有我们自己的PCI的watchdog外设qemu 虚拟机了. 目的: 1. 了解我们的外设情况. 2. 为在guest中开发我们自己的linux PCI驱动程序做 ...
- C++_enum
C++的enum可以限制成员的类型 //error C2440: “=”: 无法从“int”转换为“color” #include <iostream> using namespace s ...
- 20140613_JavaWeb学习之开发环境配置篇
本文所使用软件百度云盘网址:http://pan.baidu.com/s/1kTDRFwz 1安装JDK 操作系统:windows7-64bit 版本号:jdk-7u51-windows-x64 安装 ...
- FlashFXP使用教程
点FlashFXP菜单栏“站点-站点管理”打开站点管理器.然后点新建站点,输入站点名称(随意),确定. 编辑站点管理器里新建的站点的相关信息,包括站点名称.地址.用户名称.密码等.编辑完成,点应用 ...
- JSP标签库
step1: 定义一个标签处理类:改类必须实现SimpleTag接口,在实际中是拓展它的子类SimpleTagSupport.复写doTag方法 public class MyTag extends ...
- CI(-)框架结构
一 CI 是什么 CodeIgniter is an Application Development Framework - a toolkit - for people who build web ...
- jQuery入门第二
element选择器 在文具盒中,有铅笔.钢笔和水彩笔,类似于页面中的<div>.<span>各个元素,虽然同属于一个容器,但有各自的功能,jQuery中可以根据元素名查找元 ...