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结尾的所有元素。

posted @ 2013-04-01 11:16  _HK_  阅读(539)  评论(2编辑  收藏  举报