pythonvector初始化_C++vector多维数组初始化及清零vector常⽤⽅法
assign() 对Vector中的元素赋值
void assign( input_iterator start, input_iterator end ); //
void assign( size_type num, const TYPE &val );
reserve() 设置Vector最⼩的元素容纳数量 函数为当前vector预留⾄少共容纳size个元素的空间.(译注:实际空间可能⼤于size)
resize() 改变Vector元素数量的⼤⼩ 函数改变当前vector的⼤⼩为size,且对新创建的元素赋值val
swap() 交换两个Vector
capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
max_size() 返回Vector所能容纳元素数量的最⼤值(译注:包括可重新分配内存).
size() 返回Vector元素数量的⼤⼩
get_allocator() 返回vector的内存分配器
初始化及清零
数组定义时初始化定义空⼆维vector,再赋值
vector > ivec(m ,vector(n)); //m*n的⼆维vector,注意两个 "> "之间要有空格!
void assign(const_iterator first, const_iterator last);
void assign( size_type _Count, const Type& _Val ); // 赋值,⽤指定元素序列替换容器内所有元素
定义并初始化⼆维数组
vector > ivec(m ,vector(n,0)); //m*n的⼆维vector,所有元素初始化为0
vector v1; // 创建空容器,其对象类型为string类
vector v2(10); // 创建有10个具有初始值(即空串)的string类对象的容器
vector v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器
vector v4(v3.begin(), v3.end()); // v4是与v3相同的容器(完全复制)
iterator erase(iterator it); // 删除指定元素,并返回删除元素后⼀个元素的位置(如果⽆元素,返回end())
iterator erase(iterator first, iterator last); // 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。
void clear() const; // 函数删除当前vector中的所有元素,相当于调⽤erase( begin(), end())
assign和resize
template
void assign ( InputIterator first, InputIterator last );
void assign ( size_type n, const T& u );
assign() 函数要么将区间[first, last)的元素赋到当前vector,或者赋n个值为u的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
注意:assign操作⾸先删除vector容器内的所有元素,然后将参数指定的新元素插⼊到该容器中。
参数
first, last
标记⼀段范围的⼀对迭代器,即将[first,last)标记范围内所有元素复制到当前的vector中.包含first所指向的元素,不包含last所指向的元素。
n,u
表⽰将当前vector中重新设置为存储n个值为t的元素
void resize ( size_type sz, T c = T() );
改变长度
把当前 vector容器的的长度⼤⼩重设为sz
如果sz⼩于当前vector容器的size,则删除多出来的元素,否则采⽤值为 T 来初始化新添加的元素
参数
sz
要设置当前vector的size的值
Member type size_type is an unsigned integral type.
c
⽤初始化的新添加的元素的值。
可为空,为空则表⽰采⽤值初始化来初始化新添加的元素
resize函数有2个重载版本,⼀个只有⼀个size_type参数,⼀个除了size_type参数外还有_Ty _val,即“可选”新元素值。
先说第⼀个版本:
void resize(size_type _Newsize)
{ // determine new length, padding with _Ty() elements as needed
resize(_Newsize, _Ty());
}
可见它⽤_Ty()做第2个参数,调⽤了它的第2个版本。第2个版本的定义如下:
void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
由定义可知,对于第⼀个版本:
若_Newsize⼩于oldsize,则剩余元素值不变。
若_Newsize⼤于oldsize,则新添加的元素值⽤元素的默认构造参数初始化(特别的,int型的将被初始化为0)。
对于第2个版本:
若_Newsize⼩于oldsize,则剩余元素值不变。(全部调⽤erase(begin() + _Newsize, end())擦除掉多余元素)
若_Newsize⼤于oldsize,则新添加的元素值⽤提供的第2个参数初始化。
不管⽤哪个版本,[0,min(_Newsize,oldsize))范围内的值均保持不变。
capcity和size
CAPCITY是此容器当前可以容纳的最⼤元素个数,就是不⽤重新分配内存是可以容纳的个数
SIZE是现在容器中已经存在的元素个数
所以容量>=长度
vector a(10);
a.push_back(1);
此时a.size()=1,a.capacity()=10
reverse和resize
vector 的reverse只是增加了vector的capacity,但是size没有改变!
resize同时改变了vector的capacity和size!
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引⽤容器内的元素,因此当加⼊新的元素时,需要⽤
push_back()/insert()函数。
resize是改变容器的⼤⼩,并且创建对象,因此,调⽤这个函数之后,就可以引⽤容器内的对象了,因此当加⼊新的元素时,⽤operator[]操作符,或者⽤迭代器来引⽤元素对象。
再者,两个函数的形式是有区别的,reserve函数之后⼀个参数,即需要预留的容器的空间;resize函数可以有两个参数,第⼀个参数是容器新的⼤⼩,第⼆个参数是要加⼊容器中的新元素,如果这个参数被省略,那么就调⽤元素对象的默认构造函数。
vector myVec;
// 此时不能⽤[]访问元素
for (int i = 0; i < 100; i++ )
{
myVec.push_back( i ); //新元素这时才构造
}
myVec[100] = 1; //直接操作新元素
myVec[101] = 2;
为实现resize的语义,resize接⼝做了两个保证:
⼀是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
⼆是保证区间[0, new_size)范围以外数据⽆效,如果下标index在区间外,vector[indext]是⾮法的。
reserve只是保证vector的空间⼤⼩(capacity)最少达到它的参数所指定的⼤⼩n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是⾮法的,视具体情况⽽定。
resize和reserve接⼝的共同点是它们都保证了vector的空间⼤⼩(capacity)最少达到它的参数所指定的⼤⼩。
vector list 赋值速度⽐较
v2 = v1;//⽤赋值操作符赋值vector()(3rd)
l2 = l1;//⽤赋值操作符赋值list
v2.assign(v1.begin(), v1.end());//⽤assign给vector赋值(1st)
l2.assign(l1.begin(), l1.end());//⽤assign给list赋值
copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));//⽤copy算法给vector赋值(插⼊迭代器⽅式)(5nd)
copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));//⽤copy算法给list赋值(插⼊迭代器⽅式)
copy(v1.begin(), v1.end(), v2.begin());//⽤copy算法给vector赋值(resize)(2nd)
copy(l1.begin(), l1.end(), l2.begin());//⽤copy算法给list赋值(resize)
v2.assign(l1.begin(), l1.end());//⽤assign给vector赋值(从list)(4st)
l2.assign(v1.begin(), v1.end());//⽤assign给list赋值(从vector)
总结:
vector:对于vector赋值⽅式中,assign的速度是最快的,其次是resize以后⽤copy算法赋值,⽽最先能够想到的赋值操作符,速度却并不快,只能够排名第三,⽬前还不知道这是为什么,采⽤插⼊迭代器再⽤copy的⽅式是速度最慢的⼀种。
list:对于list赋值,赋值操作符的速度是最快的,其次是assign,然后是采⽤resize的copy,最后⼀位同样是采⽤插⼊迭代⼦⽅式的copy。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论