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

http://blog.csdn.net/hai200501019/article/details/11713519

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

  1. QVector 和vector的比较

    QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快, ...

  2. QVector也是隐式数据共享的

    Behind the scenes, QString uses implicit sharing (copy-on-write) to reduce memory usage and to avoid ...

  3. 警告: 隐式声明与内建函数‘exit’不兼容 [默认启用]

    警告: 隐式声明与内建函数‘exit’不兼容 [默认启用] 最近在学习linux下的多任务编程,用到exit等函数时,经常出现该警告,查找资料后发现,原因其实很简单,没有把stdlib.h头文件包含进 ...

  4. MYSQL中默认隐式事务及利用事务DML

    一:默认情况下,MySQL采用autocommit模式运行.这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中.默认级别为不可重复读. 二:会造成隐式提交的语句以下语 ...

  5. 继承:继承后子类构造函数具有隐式super,所以子类中所以的构造函数默认会访问父类中的空参数的构造函数

    class Test { Test(){ System.out.println("Test"); } Test(String name){ System.out.println(& ...

  6. C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转

    对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...

  7. js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

     壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...

  8. JS五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解(转载)

    目录 壹 ❀ 引 贰 ❀ this默认绑定 叁 ❀ this隐式绑定 1.隐式绑定 2.隐式丢失 肆 ❀ this显式绑定 伍 ❀ new绑定 陆 ❀ this绑定优先级 柒 ❀ 箭头函数的this ...

  9. 8. react 基础 - props 默认值和类型限制 与 Props , State , render 函数 关系

    一. PropTypes 与 DefaultProps 官方文档 1. PropTypes 属性校验 引入 PropTypes import PropTypes from 'prop-types'; ...

随机推荐

  1. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...

  2. 使用wget -i下载多个文件

    使用wget -i下载多个文件 命令: wget -i filelist.txt 说明: 首先,保存一份下载链接文件 cat > filelist.txt url1 url2 url3 url4

  3. linux操作系统死机处理办法

    这个方法可以在各种情况下安全地重启计算机.大家在键盘上找,可以找到一个叫做“Sys Rq”的键,在台机的键盘上通常与 Prt Sc 共键,在笔记本可能在其他位置,如 Delete.以台机为例,要使用这 ...

  4. Apache和Nginx下禁止访问特定的目录或文件

    大家是否测试Apache做了目录禁止浏览后,目录下面的txt文件还是可以显示里面的内容的.例如:http://www.domain.com/test/此访问会报403错误,但是如果test下有很多tx ...

  5. 第四节 二维条码与磁卡、IC卡、光卡之比较

    二维条码同其他几种自动识别技术的比较可见下表: 比较点 二维条形码 磁卡 IC卡 光卡 抗磁力 强 弱 中等 强 抗静电 强 中等 中等 强 抗损性 强可折叠可局部穿孔可局部切割 弱不可折叠不可穿孔不 ...

  6. PROTEL99 SE生成的gerber 与ncdrill的坐标不对应

    导入cam350后的: 解决方法:出gerber的时候在高级选项里面. 1.数据单位及格式 2.优化设置

  7. QT图片旋转

    目前发现有两种方法,如下: 1.使用QPixmap的transformed函数旋转,这个函数默认是以图片中心为旋转点,不能随意设置旋转点,使用如下: QMatrix leftmatrix; leftm ...

  8. 这些屌炸天的创业者为何对投资人说NO

    曾有人说,世上的创业者只分为两种,一种是找到投资的,一种是没有找到的. 但其实还有第三种,就是那些拒绝了投资人的创业者. 他们摒弃了投资人抛来的橄榄枝,并非不差钱,不接受投资的原因大体出于两个方面,一 ...

  9. 细说UI线程和Windows消息队列(经典)

    在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的. 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如 ...

  10. 解题报告 HDU1159 Common Subsequence

    Common Subsequence Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...