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