• (五)STL序列容器(deque)


       

     1.实现原理

                             

    vector : 
        采用的是连续的线性空间

    deque : 
        存储的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同

        为管理这些连续的空间,deque容器用数组存储着各个连续空间的地址,即数组中存储的都是指针,

    由于 deque 容器底层将序列中的元素分别存储到了不同段的连续空间中,因此要想实现迭代器的功能,必须先解决如下 2 个问题:
      (1)迭代器在遍历 deque 容器时,必须能够确认各个连续空间在 map 数组中的位置;
      (2)迭代器在遍历某个具体的连续空间时,必须能够判断自己是否已经处于空间的边缘位置。如果是,则一旦前进或者后退,就需要跳跃到上一个或者下一个连续空间中。

    2.使用方法

    基本方法

    #include<stdio.h>
    #include<iostream>
    #include<vector>
    #include<deque>
    using namespace std;
    
    int main()
    {
        deque<int> d;
        d.push_back(10);
        d.push_back(9);
        d.push_back(8);
        d.push_back(7);
    
        // 两种获取方式
        printf("
    ");
        for (auto i = d.begin(); i < d.end(); i++) {
            cout << *i << endl;
        }
    
        printf("
    ");
        for (auto i = begin(d); i < end(d); i++) {
            cout << *i << endl;
        }
    
        // 访问方式 
        printf("
    ");
        cout << d[1] << endl;
        cout << d.at(1) << endl;
        cout << d.front() << endl;
        cout << d.back() << endl;
        /*    
            1.没有提供data()成员,不能访问
            cout << d.data() << endl; 
    
            2.deque存储元素时,无法保证其会将元素存储在连续的内存空间中,因为不能用指针访问
            auto first = d.begin()+1;
            auto end = d.end()-1;
            while (first < end) {
                cout << *first << endl;
                ++first;
            }
        */
        
    
        system("pause");
        return 1;
    }

     

    insert使用

    #include<stdio.h>
    #include<iostream>
    #include<vector>
    #include<deque>
    #include<array>
    using namespace std;
    
    void ShowPrint(deque<int> d)
    {
    	for (int i = 0; i < d.size(); i++) {
    		cout << d[i] << "  ";
    	}
    	/* 这种显示不好
    	for (auto i = d.begin(); i < d.end(); i++) {
    		cout << *i << endl;
    	}
    	*/
    	printf("
    
    ");
    }
    
    int main()
    {
    	deque<int> d{ 1,10 };
    	// 第一种
    	d.insert(d.begin() + 1, 33); // 1 33 10
    	ShowPrint(d);
    
    	// 第二种
    	d.insert(d.end(), 3, 6); // 1 33 10 6 6 6 
    	ShowPrint(d);
    
    	// 第三种
    	array<int, 3>arr{ 11,21,31 };
    	d.insert(d.end(), arr.begin(), arr.end());
    	ShowPrint(d); // 1 33 10 6 6 6 11 21 31
    
    	// 第四种
    	d.insert(d.end(), { 41,51 });
    	ShowPrint(d);
    
    	system("pause");
    	return 1;
    }
    

      

    做一个优秀的程序媛
  • 相关阅读:
    lucas定理计算组合数
    西电校赛网络赛J题 lucas定理计算组合数
    bestcoder#37_1001 字符串,贪心
    codeforces#297div2_d bfs,2*2法判断矩阵里的矩形
    codeforces#297div2_c 贪心
    codeforces#297div2_b 贪心,字符串,哈希
    poj2983——差分约束,bellman_ford
    poj1201——差分约束,spfa
    图的邻接表存储
    hiho1093 ——spfa
  • 原文地址:https://www.cnblogs.com/oytt/p/13959684.html
Copyright © 2020-2023  润新知