vector之reserve和resize ,ersae和remove
1. vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size。
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。
int main(int argc, char* argv[])
{
vector<int> vect;
vect.push_back(1);
vect.push_back(2);
vect.push_back(3);
vect.push_back(4);
vect.reserve(100);
cout<<vect.size()<<endl;
cout<<vect.capacity()<<endl;//size为4,但是capacity为100
int i = 0;
for (i = 0; i < 4; i++)//新元素还没有构造, 此时不能用[]访问元素第五个及以后的元素
{
cout<<vect[i]<<endl;
}
return 0;
}
int main(int argc, char* argv[])
{
vector<int> vect;
vect.push_back(1);
vect.push_back(2);
vect.push_back(3);
vect.push_back(4);
vect.resize(100); //新的空间不覆盖原有四个元素占有的空间
cout<<vect.size()<<endl;
cout<<vect.capacity()<<endl;//size和capacity都是100
int i = 0;
for (i = 0; i < 100; i++) //可以用operator[]操作符访问后面的元素
{
cout<<vect[i]<<endl;
}
return 0;
}
int main(int argc, char* argv[])
{
vector<int> vect;
vect.resize(100); //分配100个空间
vect.push_back(1); //在100个后面接着分配
vect.push_back(2);
vect.push_back(3);
vect.push_back(4);
cout<<vect.size()<<endl;
cout<<vect.capacity()<<endl;//现在size和capacity都是104
int i = 0;
for (i = 0; i < 104; i++)
{
cout<<vect[i]<<endl;
}
return 0;
}
2. erase()返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素.
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 3)
iter = veci.erase(iter);
}
这样无法删除连续两个3.
需要写成:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == 3)
iter = veci.erase(iter);
else
iter ++ ;
}
remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
typedef vector<int > IntVector ;
//Define an iterator for template class vector of integer
typedef IntVector::iterator IntVectorIt ;
IntVector Numbers(8) ; //vector containing numbers
IntVectorIt start, end, it, last;
start = Numbers.begin() ; // location of first
// element of Numbers
end = Numbers.end() ; // one past the location
// last element of Numbers
//Initialize vector Numbers
Numbers[0] = 10 ;
Numbers[1] = 20 ;
Numbers[2] = 10 ;
Numbers[3] = 15 ;
Numbers[4] = 12 ;
Numbers[5] = 7 ;
Numbers[6] = 9 ;
Numbers[7] = 11 ;
cout << "Before calling remove" << endl ;
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ; // 输出为10 20 10 15 12 7 9 11 若Numbers[7] = 10,输出为10 20 10 15 12 7 9 10
// remove all elements from Numbers that match 10
last = remove(start, end, 10) ;
cout << "After calling remove" << endl ;
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ; //20 15 12 7 9 11 9 11(删掉后的元素前移,删掉几位在在末尾显示内存中用未移动的末几位)若Number[7] = 10,输出为20 15 12 7 9 7 9 10
//print number of elements removed from Numbers
cout << "Total number of elements removed from Numbers = "
<< end - last << endl ; //为2,若Number[7]= 10,为3
//print only the valid elements of Number
cout << "Valid elements of Numbers { " ;
for(it = start; it != last; it++)
cout << *it << " " ;
cout << " }\n" << endl ; //20 15 12 7 9 11,若Number[7]= 10,输出20 15 12 7 9,此时Numbers的大小还是8.
}
remove()需要和erase()配合使用,如erase(remove(svec.begin(),svec.end(),"be"), svec.end());
这句的意思是,取得"be"的位置(位于结尾),然后删除"be"到原vector结尾的所有元素。

浙公网安备 33010602011771号