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

  • 相关阅读:
    理解OAuth 2.0
    asp.net core webapi/website+Azure DevOps+GitHub+Docker
    ASP.NET Core分布式项目实战
    Docker 在 centos 7上升级
    35.Docker安装Mysql挂载Host Volume
    34.Docker安装Mysql参数及环境变量使用
    33.Docker安装Mysql及用户配置
    32.Docker安装MongoDb
    如何用Spring Boot自定义Banner
    如何实现JDK10的新特性:var泛型和多个接口,案例详解
  • 原文地址:https://www.cnblogs.com/yannuonuo/p/2992991.html
Copyright © 2020-2023  润新知