• 顺序容器


    顺序容器的种类有:vector,list、deque(vector元素是连续存放的

    顺序容器适配器:stack,queue,priority_queue

    关于容器内的元素类型约束:容器内的元素必须支持赋值和赋值操作。

    迭代器:所有的迭代器都有相同的借口(其实就是有相同的成员函数),都支持==和!=的关系操作符,但是对于vector和deque这两个容器却提供了额外的关系操作符,他们支持(假设迭代器对象为iter)的额外操作有:iter+n,iter1 += iter2,>,>=,<,<=。

    向容器内添加元素的方法有通用的insert接口和push_back接口,同时,对于list和deue而言还有push_front接口,需要注意的是,当修改了容器之后,原先的容器的迭代器可能会失效,最好的例子就是,如果在修改或者删除容器内的元素之前存储了end返回的迭代器,那么当修改完容器之后,这个迭代器会失效,所以在代码中应该尽量避免存储end返回的迭代器。

    容器的大小操作:resize(int )和resize(int, T),max_size()。resize用来改变容器所包含的元素个数,如果当前容器的长度比resize给出的长度要大,那么容器就会将容器的多出来的后面部分从容器中删除,若当前容器的大小小于resize给出的 长度,则系统就会在容器的后部添加元素。

    赋值(asign)和交换(swap),asign首先会将原先容器内的所有元素删除,然后再将新的值复制到容器内,li = li1相当于:

    li.erase(li.begin(), li.end());//删除
    li.insert(li.begin(),li1.begin(),li1.end());

    swap操作是一个常量级的函数调用,不会删除和插入任何元素,因此迭代器不会失效。(我觉得这swap操作相当于换名,操作的对象相互换名字)


    容器的内存管理

    vector的元素是连续存放的,而其他的则相当于链表的内存结构。容器的max_zise(0是和平台相关的,是说容器最大是多少,而capacity()则是相对于特定的容器在不需要重新分配内存的情况下所能容纳的最大元素个数。举个例子,对于局部数组而言(windows下面的),由于栈的最大值为1M,所以在数组最大只能声明为1M大小,这个相当于max_size,但是特定的数组,比如你声明了数组int a[20],这个数组最大能够容纳20个元素,此即为capacity()。

    vector<int> vec(5,10);
    vector<int> vec1(2,1);
    vector<char> vec2(4,'2');
    
    //查看capacity 
    cout << "vec的capacity:" << vec.capacity() << endl;//输出5 
    cout << vec.max_size() << endl; 
    cout << vec1.max_size() << endl; 
    cout << vec2.max_size() << endl; 
    //插入一个元素后 ,超过capacity,所以需要重新分配内存
    //capacity变大 
    vec.push_back(13); 
    cout << "vec的capacity:" << vec.capacity() << endl;
    cout << vec.max_size() << endl; 
    //删除一个元素后,不需要重新分配内存,所以capacity不变 
    vec.pop_back(); 
    cout << "vec的capacity:" << vec.capacity() << endl;
    cout << vec.max_size() << endl; 

    对于上述代码的运行结果发现,vec和vec1的max_size是相同的,而vec2大约是vec的4倍,可以想象,编译器会给一个容器对象固定的大小,但是因容器内的元素类型不一样,所以会产生max_size不一样,但是对于相同的元素类型的容器,其大小是一样的。对于上述代码中的vec1和vec2,如果对vec1的max_size结果成衣4,那么就会发现此时他们几乎就相等了。如下图所示:


    从结果可以看出,就是数学中所说的约等于。、


    练习代码:

    #include <iostream>
    #include <vector>
    #include <list>
    #include <deque>
    #include <string>
    
    using namespace std;
    int main(int argc, char *argv[])
    {
    	//定义一个1长度为10的list容器 
    	list<string> li(2,"init_data");
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//push_front 
    	li.push_front("push_front");
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//push_back 
    	li.push_back("push_back");
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//insert 
    	li.insert(++li.begin(),"insert(p,t)");
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	li.insert(--li.end(),2,"insert(p,n,t)");
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl << endl;
    	
    	//insert
    	/******************************************************** 
    	 *li.insert(li.end(),li.begin(),--li.end());
    	 *上面的这一句有问题,修改了容器,所以两处使用end会出错 ,
    	 *该语句原本想把原容器内的内容复制一遍到后面,可是不成功,
    	 *我的运行结果是容器内剩最后的一个元素没有复制,所以下
    	 *面的resize不能回复容器
    	 ********************************************************/ 
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//resize
    	//容器大小减半 
    	cout << "容器大小减半:" << endl;
    	li.resize(li.size()/2); 
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//删除容器的元素,clear可以删除所有元素, 
    	//当然也可以通过pop_front和pop_back删除元素 
    	cout << "删除首元素:" << endl; 
    	li.erase(li.begin()); 
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl; 
    	
    	//容器大小再减半 
    	cout << "容器大小减半:" << endl;
    	li.resize(li.size()/2); 
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << endl;
    	
    	//容器大小翻倍 
    	cout << "容器大小翻倍:" << endl;
    	//resize变大的话,若不指定增加元素值,采用值初始化(初始化为对应的数据类型的默认值)
    	li.resize(li.size()*2,"resize_add"); 
    	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
    		cout << *i << "  ";
    	cout << "大小为" << li.size() << endl;
    	
    	//back和font的使用
    	//back为*--end(),front为*begin() 
    	cout << "front:" << li.front() << "  back:" << li.back() << "  \n" << endl;
    	
    	vector<int> vec(5,10);
    	vector<int> vec1(2,1);
    	vector<char> vec2(4,'2');
    	
    	//查看capacity 
    	cout << "vec的capacity:" << vec.capacity() << endl;//输出5 
    	cout << vec.max_size() << endl; 
    	cout << "vec1.max_size()*4:" << vec1.max_size()*4 << endl; 
    	cout << "vec2.max_size():" << vec2.max_size() << endl; 
    	//插入一个元素后 ,超过capacity,所以需要重新分配内存
    	//capacity变大 
    	vec.push_back(13); 
    	cout << "vec的capacity:" << vec.capacity() << endl;
    	cout << vec.max_size() << endl; 
    	//删除一个元素后,不需要重新分配内存,所以capacity不变 
    	vec.pop_back(); 
    	cout << "vec的capacity:" << vec.capacity() << endl;
    	cout << vec.max_size() << endl; 
    	
    	return 0;
    }

    运行结果:




  • 相关阅读:
    【求教】
    【刷题】【dp】【贪心】D. Nastya and Scoreboard
    【笔记】STL的七种武器(三)算法
    【刷题】【stl】【字符串】反片语
    【刷题】【字符串】加入数字
    【笔记】【字符串】c++的输入总结
    【刷题】【dfs】【暴力】不如来上分
    【笔记】c语言学习记录
    【笔记】实践中学C语言 100例
    【笔记】STL的七种武器(二)关联容器
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225219.html
Copyright © 2020-2023  润新知