- vector容器
vectoor是一个单口容器。 vector动态增长的基本原理
当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请空间。
vecotr这么做的原因是:vector中的元素是连续存储的,当容器中没有空间容纳新的元素,则由于元素必须连续存储以便索引访问,所以不能在内存中随便找个地方存储这个新元素,必须要开辟新的存储空间。- vector的data()
之前一直没有注意到vector的data()用法,在代码片段中用到了vector的data()
memcpy( m_arrPtData.data(), arrData.data(), iLineNum * iTriggerSize * sizeof( ushort ) );
data()的函数接口如下:
_Tp*
data() _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); }
const _Tp*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); }
- vector的resize()和reserve()用法及区别
出错的代码片段:
void Net_Operator::Net_UDP_GetNaviData( std::vector<Nav1>& arrNavi1, std::vector<Nav2>& arrNavi2 )
{
int iSize = m_arrNavi1_b.size();
arrNavi1.resize( iSize );
memcpy( arrNavi1.data(), m_arrNavi1_b.data(), iSize * sizeof( Nav1 ) );
iSize = m_arrNavi2_b.size();
arrNavi2.reserve( iSize );
memcpy( arrNavi2.data(), m_arrNavi2_b.data(), iSize * sizeof( Nav2 ) );
}
其中arrNavi2.reserve( iSize );
的正确写法是arrNavi2.resize( iSize );
1.vector的capacity和size的区别
size指的是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
vector<int> ivec;
qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity();
for(vector<int>::size_type ix = 0;ix != 24;++ix)
{
ivec.push_back(ix);
}
qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity();
ivec.reserve(50);
qDebug() << "ivec:size "<<ivec.size()
<< " " << "ivec:capacity " << ivec.capacity();
return a.exec();
}
运行结果为:
ivec容器的当前状态如下图:
2.resize()和reserve()的区别
reserve是容器预留空间,但在空间内不真正创建元素对象,所以没有在添加新的对象之前,不能引用容器中的元素。
resize是改变容器的大小,且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了。