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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)相关的知识,希望对你有一定的参考价值。

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默认使用隐式共享,而且有更多的函数提供)的主要内容,如果未能解决你的问题,请参考以下文章

qvector倒序插入

将 std::vector 复制到 qvector

QList和QVector等容器的区别:

再谈QVector与QByteArray——Qt的写时复制(copy on write)技术

再谈QVector与QByteArray——Qt的写时复制(copy on write)技术

QVector的内存分配策略