C++进阶编程 --- 3(上).string容器、vector容器、deque容器、stack容器

文章目录

    • 第三章(上):
      • 3.STL 常用容器
        • 3.1 string容器
          • 3.1.1 string基本概念
          • 3.1.2 string构造函数
          • 3.1.3 string赋值操作
          • 3.1.4 string字符串拼接
          • 3.1.5 string查找和替换
          • 3.1.6 string字符串比较
          • 3.1.7 string字符存取
          • 3.1.8 string插入与删除
          • 3.1.9 string子串
        • 3.2 vector容器
          • 3.2.1 vector基本概念
          • 3.2.2 vector构造函数
          • 3.2.3 vector赋值操作
          • 3.2.4 vector容量和大小
          • 3.2.5 vector插入与删除
          • 3.2.6 vector数据存取
          • 3.2.7 vector互换容器
          • 3.2.8 vector预留空间
        • 3.3 deque容器
          • 3.3.1 deque基本概念
          • 3.3.2 deque构造函数
          • 3.3.3 deque赋值操作
          • 3.3.4 deque大小操作
          • 3.3.5 deque插入与删除
          • 3.3.6 deque数据存取
          • 3.3.7 deque排序
        • 3.4 案例 - 后续更新
        • 3.5 stack容器
          • 3.5.1 stack基本概念
          • 3.5.2 stack常用接口

第三章(上):

3.STL 常用容器

3.1 string容器
3.1.1 string基本概念

本质:是一个类。

string与char *区别

  • char *是一个指针

  • string是一个,内部封装了char *,管理字符串,一个char *型的容器

特点

  • string类内部封装了许多成员方法,如查找find,删除delete,插入insert等方法

  • string管理char *所分配内存,不需担心出现复制越界和取值越界等问题,由类内部进行负责

3.1.2 string构造函数

函数原型

  • string(); //创建一个空字符串
    string(const char* s); //使用字符串s初始化

  • string(const string& str); //使用一个string对象初始化另一个string对象

  • string(int n, char c); //使用n个字符c初始化

#include <iostream>
using namespace std;
#include <string>

void test01()
{
    string s1; //默认构造
    cout << "s1 = " << s1 << endl;

    const char* str = "hello";
    cout << "str = " << str << endl;

    string s2(str);
    cout << "s2 = " << s2 << endl;

    string s3(s2);
    cout << "s3 = " << s3 << endl;

    string s4( 5, 'h');
    cout << "s4 = " << s4 << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.1.3 string赋值操作

作用:给字符串进行赋值。

函数原型

  • string& operator=(const char* s); //char*类型字符串赋值给当前字符串

  • string& operator=(const string &s); //字符s赋值给当前字符串

  • string& operator=(char c); //字符赋值给当前字符串

  • string& assign=(const char* s); //字符串s赋值给当前字符串

  • string& assign=(const char* s, int n); //字符串s的前n个字符赋值给当前字符串

  • string& assign=(const string &s); //字符串s赋值给当前字符串

  • string& assign=(int n, char c); //n个字符赋值给当前字符串

#include <iostream>
using namespace std;
#include <string>

void test01()
{
    string str1;
    str1 = "hello";
    cout << "str1 = " << str1 << endl;

    string str2;
    str2 = str1;
    cout << "str2 = " << str2 << endl;

    string str3;
    str3 = 'h';
    cout << "str3 = " << str3 << endl;

    string str4;
    str4.assign("hello");
    cout << "str4 = " << str4 << endl;

    string str5;
    str5.assign("hello", 2);
    cout << "str5 = " << str5 << endl;

    string str6;
    str6.assign(str5);
    cout << "str6 = " << str6 << endl;

    string str7;
    str7.assign(5, 'h');
    cout << "str7 = " << str7 << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.1.4 string字符串拼接

作用:在字符串末尾拼接字符串

函数原型:

  • string& operator+=(const char* str); //重载+=操作符

  • string& operator+=(const char c); //重载+=操作符

  • string& operator+=(const string& str); //重载+=操作符

  • string& append(const char *s); //字符串s连接到当前字符串结尾

  • string& append(const char *s, int n); //字符串s前n个字符连接到当前字符串结尾

  • string& append(const string &s); //重载+=操作符

  • string& append(const string &s, int pos, int n)
    //字符串s从pos开始的n个字符连接到字符串结尾

    #include <iostream>
    using namespace std;
    #include <string>
    
    void test01()
    {
        string str1 = "你好";
        str1 += "我叫小明";
        cout << "str1 = " << str1 << endl;
    
        string str2 = "hello";
        str1 += str2;
        cout << "str1 = " << str1 << endl;
        cout << "str2 = " << str2 << endl;
    
        string str3 = "你";
        str3.append("好");
        cout << "str3 = " << str3 << endl;
    
        str3.append("jack", 3);
        cout << "str3 = " << str3 << endl;
    
        str3.append(str2);
        cout << "str3 = " << str3 << endl;
    
        str3.append(str2, 0, 3);
        cout << "str3 = " << str3 << endl;
    }
    
    int main()
    {
        test01();
        system("pause");
        return 0;
    }
    
3.1.5 string查找和替换

作用

  • 查找:查找指定字符串是否存在

  • 替换:在指定位置置换字符串

函数原型

  • int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找

  • int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找

  • int find(const char* s, int pos, int n) const; //从pos位置开始查找s的前n个字符第一个位置

  • int find(const char c, int pos = 0) const; //查找字符c第一次出现位置

  • int rfind(const string& str, int pos = npos) const;//查找str最后一次出现位置,从pos开始查找

  • int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找

  • int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置

  • int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置

  • string& replace(int pos, int n, const string& str);//替换从pos开始n个字符为字符串str

  • string& replace(int pos, int n, const char* s); //替换从pos开始n个字符为字符串s

#include <iostream>
using namespace std;

//查找
void test01()
{
    string str1 = "asdfgh";
    int pos = str1.find("dg");
    cout << "pos = " << pos << endl;
    if (pos == -1)
    {
        cout << "未找到字符串" << endl;
    }
    else
    {
        cout << "找到字符串,pos = " << pos << endl;
    }

    pos = str1.rfind("df");
    cout << "pos = " << pos << endl;
}


//替换
void test02()
{
    string str2 = "qwertyu";
    str2.replace(1, 3, "hhhh"); //1号位置起3个字符,替换“hhhh”
    cout << "str2 = " << str2 << endl;
}

int main()
{
    test01();
    test02();
    system("pause");
    return 0;
}

find与rfind区别

  • find: 从左往右查找

  • rfind:从右往左查找

3.1.6 string字符串比较

作用:字符串之间比较

比较方式:ASCII码

  • = 返回 0

  • < 返回 -1

  • 》返回 1

函数原型

  • int compare(const string &s) const; //与字符串s比较

  • int compare(const char *s) const; //与字符串s比较

#include <iostream>
using namespace std;

void test01()
{
    string str1 = "hello";
    string str2 = "hallo";
    if (str1.compare(str2) == 0)
    {
        cout << "str1 = str2" << endl;
    }
    else if (str1.compare(str2) > 0)
    {
        cout << "str1 > str2" << endl;
    }
    else
    {
        cout << "str1 < str2" << endl;
    }
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.1.7 string字符存取

函数原型

  • char& operator[] (int n); //通过[]方式获取字符

  • char& at(int n); //通过at方式获取字符

#include <iostream>
using namespace std;

void test01()
{
    string str1 = "hello";
    string str2 = "hallo";

    //获取字符
    for (int i = 0; i < str1.size(); i++)
    {
        cout << str1[i] << " ";
    }
    cout << endl;

    for (int i = 0; i < str2.size(); i++)
    {
        cout << str2.at(i) << " ";
    }
    cout << endl;

    //修改字符
    str1[1] = 'a';
    cout << "str1 = " << str1 << endl;

    str2.at(0) = 'e';
    cout << "str2 = " << str2 << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.1.8 string插入与删除

作用:对string字符串进行插入和删除字符操作

函数原型

  • string& insert(int pos, const char* s); //插入字符串

  • string& insert(int pos, const string& str); //插入字符串

  • string& insert(int pos, int n, char c); //在指定位置插入n个字符c

  • string& erase(int pos, int n = npos); //删除从pos开始的n个字符

#include <iostream>
using namespace std;

void test01()
{
    //插入
    string str1 = "hello";
    str1.insert(1, "yyy");
    cout << "str1 = " << str1 << endl;

    //删除
    str1.erase(1, 3);
    cout << "str1 = " << str1 << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.1.9 string子串

作用:从字符串中获取子串

函数原型

  • string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
#include <iostream>
using namespace std;

void test01()
{
    string str = "hello";
    string subStr = str.substr(1, 3);
    cout << "subStr = " << subStr << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2 vector容器
3.2.1 vector基本概念

作用:与数组非常相似,也称单端数组

vector与普通数组区别

  • 数组是静态空间,vector可动态扩展

动态扩展

  • 找更大的内存空间,将原数据拷贝至新空间,释放原空间

在这里插入图片描述

  • vector容器的迭代器是支持随机访问的迭代器
3.2.2 vector构造函数

作用:创建vector容器

函数原型

  • vector<T> v;           //采用模板实现类实现,默认构造函数
    
  • vector(v.begin(), v.end()); //v[begin(), end())区间中的元素拷贝给本身

  • vector(n, elem); //n个elem拷贝给本身

  • vector(const vector &vec); //拷贝构造函数

#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int> &v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1; //默认构造函数
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printVector(v1);

    //通过区间方式构造
    vector<int> v2(v1.begin(), v1.end());
    printVector(v2);

    //通过n个elem方式构造
    vector<int>v3(10, 10);
    printVector(v3);

    //拷贝构造
    vector<int>v4(v3);
    printVector(v4);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2.3 vector赋值操作

作用:给vector容器进行赋值

函数原型

  • vector& operator=(const vector &vec) //重载等号操作符

  • assign(beg, end); //[beg, end)区间的数据拷贝赋值给本身

  • assign(n, elem); //n个elem拷贝赋值给本身

#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1; 
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printVector(v1);

    //operator=
    vector<int> v2;
    v2 = v1;
    printVector(v2);

    //assign
    vector<int> v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);

    //n个elem方式
    vector<int> v4;
    v4.assign(10, 10);
    printVector(v4);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2.4 vector容量和大小

作用:进行vector容器的容量和大小操作

函数原型

  • empty(); //判断容器是否为空

  • capacity(); //容器的容量

  • size(); //返回容器中元素个数

  • resize(int num); //重新指定容器长度为num,如果容器变长,则以默认值填充新位置

                                     //如果容器变短,则末尾超出容器长度的元素将被删除
    
  • resize(int num, elem); //重新指定容器长度num,如容器变长,则以elem填充新位置

                                             //如容器变短,则末尾超出容器长度的元素将被删除
    
#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printVector(v1);

    if (v1.empty())
    {
        cout << "v1为空" << endl;
    }
    else
    {
        cout << "v1不为空" << endl;
        cout << "v1的容量为" << v1.capacity() << endl;
        cout << "v1的大小为" << v1.size() << endl;
    }

    //给v1容器重新指定大小
    v1.resize(20);
    printVector(v1); //如果重新指定的长度比原长度长,默认用0填充新的位置

    v1.resize(20, 10);
    printVector(v1);

    v1.resize(5);
    printVector(v1); //如果重新指定的长度比原长度短,超出的部分将被删除
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2.5 vector插入与删除

作用:进行vector容器的插入和删除操作

函数原型

  • push_back(ele); //尾部插入元素ele

  • pop_back(); //删除最后一个元素

  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele

  • insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele

  • erase(const_iterator pos); //删除迭代器指向的元素

  • erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素

  • clear(); //删除容器中所有的元素

#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1;

    //尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVector(v1);

    //尾删
    v1.pop_back();
    printVector(v1);

    //插入 第一个参数 - v1.begin() 为迭代器
    v1.insert(v1.begin(), 3, 60);
    printVector(v1);

    //删除 参数 - 迭代器
    v1.erase(v1.begin());
    printVector(v1);

    //清空
    v1.erase(v1.begin(), v1.end());
    v1.clear();
    printVector(v1);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2.6 vector数据存取

作用:进行vector容器的数据存取操作

函数原型

  • at(int idx); //返回索引idx所指向的数据

  • operator[];//返回索引idx所指向的数据

  • front(); //返回容器中第一个数据元素

  • back(); //返回容器中最后一个数据元素

#include <iostream>
using namespace std;
#include <vector>

void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }

    for (int i = 0; i< v.size(); i++)
    {
        cout << v[i] << " "; //通过[]方式访问元素
    }
    cout << endl;

    for (int i = 0; i < v.size(); i++)
    {
        cout << v.at(i) << " "; //通过at方式访问元素
    }
    cout << endl;

    cout << "v的第一个元素为" << v.front() << endl;
    cout << "v的最后一个元素为" << v.back() << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.2.7 vector互换容器

作用:实现两个容器内元素进行互换

函数原型

  • swap(vec); //将vec与本身元素互换
#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }

    for (int i = 9; i >= 0; i--)
    {
        v2.push_back(i);
    }
    cout << "swap - before" << endl;
    printVector(v1);
    printVector(v2);

    v1.swap(v2);
    cout << "swap - after" << endl;
    printVector(v1);
    printVector(v2);
}

//实际运用
void test02()
{
    vector<int>v3;
    for (int i = 0; i < 10000; i++)
    {
        v3.push_back(i);
    }

    cout << "v3的容量为:" << v3.capacity() << endl;
    cout << "v3的大小为:" << v3.size() << endl;

    //重新指定大小
    v3.reserve(5);
    cout << "v3的容量为:" << v3.capacity() << endl;
    cout << "v3的大小为:" << v3.size() << endl;

    //利用swap收缩内存
    vector<int>(v3).swap(v3); //vector<int>(v3) 匿名对象
    cout << "v3的容量为:" << v3.capacity() << endl;
    cout << "v3的大小为:" << v3.size() << endl;

}

int main()
{
    test01();
    test02();
    system("pause");
    return 0;
}
3.2.8 vector预留空间

作用:减少在动态扩展容量时的扩展次数

函数原型

  • reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
#include <iostream>
using namespace std;
#include <vector>

void test01()
{
    vector<int> v;
    int count = 0;
    int* p = NULL;
    for (int i = 0; i < 10000; i++)
    {
        v.push_back(i);
        if (p != &v[0])
        {
            p = &v[0];
            count++;
        }
    }
    cout << "count = " << count << endl; //24
}

void test02()
{
    vector<int> v;
    v.reserve(10000);
    int count = 0;
    int* p = NULL;
    for (int i = 0; i < 10000; i++)
    {
        v.push_back(i);
        if (p != &v[0])
        {
            p = &v[0];
            count++;
        }
    }
    cout << "count = " << count << endl; //1
}

int main()
{
    test01();
    test02();
    system("pause");
    return 0;
}
3.3 deque容器
3.3.1 deque基本概念

作用:双端数组,可对头端进行插入和删除操作

deque与vector区别

  • vector对头部的插入和删除效率较低,数据量越大,效率越低

  • deque对头部的插入和删除速度比vector快些

  • vector访问元素的速度比deque快,与内部实现相关

在这里插入图片描述

deque工作原理

内部有一个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每一个缓冲区的地址,使用deque时像一块连续的内存空间

在这里插入图片描述

  • deque容器的迭代器支持随机访问
3.3.2 deque构造函数

作用:deque容器构造

函数原型

  • deque<T> deqT;          //默认构造
    
  • deque(beg, end); //[beg,end)区间中的元素拷贝给本身

  • deque(n, elem); //n个elem拷贝给本身

  • deque(const deque &deq); //拷贝构造函数

#include <iostream>
using namespace std;
#include <deque>

void printDeque(deque<int>& d)
{
    for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    deque<int>d1;
    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeque(d1);

    deque<int>d2(d1.begin(), d1.end());
    printDeque(d2);

    deque<int>d3(10, 10);
    printDeque(d3);

    deque<int>d4(d3);
    printDeque(d4);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.3.3 deque赋值操作

作用:给deque容器进行赋值

函数原型

  • deque& operator=(const deque &deq); //重载等号运算符

  • assign(beg, end); //[beg, end)区间内的元素拷贝给本身

  • assign(n, elem); //n个elem拷贝给本身

#include <iostream>
using namespace std;
#include <deque>

void printDeque(deque<int>& d)
{
    for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    deque<int> d1;
    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeque(d1);

    deque<int> d2;
    d2 = d1;
    printDeque(d2);

    deque<int> d3;
    d3.assign(d1.begin(), d1.end());
    printDeque(d3);

    deque<int> d4;
    d4.assign(10, 10);
    printDeque(d4);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.3.4 deque大小操作

作用:进行deque容器的大小操作

函数原型

  • deque.empty(); //判断容器是否为空

  • deque.size(); //返回容器中元素个数

  • deque.resize(); //重新指定容器长度为num,如果容器变长,则以默认值填充新位置
    //如果容器变短,则末尾超出容器长度的元素将被删除

  • deque.resize(num, elem);
    //重新指定容器长度num,如容器变长,则以elem填充新位置
    //如容器变短,则末尾超出容器长度的元素将被删除

#include <iostream>
using namespace std;
#include <deque>

void printDeque(deque<int>& d)
{
    for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    deque<int> d1;
    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeque(d1);

    if (d1.empty())
    {
        cout << "d1为空" << endl;
    }
    else
    {
        cout << "d1不为空" << endl;
        cout << "d1的大小为:" << d1.size() << endl;
    }

    d1.resize(5);
    printDeque(d1);

    d1.resize(20, 10);
    printDeque(d1);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.3.5 deque插入与删除

作用:进行deque容器数据的插入和删除

函数原型

两端插入操作

  • push_back(elem); //容器尾部添加一个数据

  • push_front(elem);//容器头部插入一个数据

  • pop_back(); //删除容器最后一个数据

  • pop_front(); //删除容器第一个数据

指定位置操作

  • insert(pos, elem); //在pos位置插入一个elem数据,返回新数据的位置

  • insert(pos, n , elem); //在pos位置插入n个elem数据,无返回值

  • insert(pos, beg, end);//在pos位置插入[beg, end)区间的数据,无返回值

  • clear(); 清空容器的所有数据

  • erase(beg, end); //删除[beg, end)区间的数据,返回下一个数据的位置

  • erase(pos); //删除pos位置的数据,返回下一个数据的位置

#include <iostream>
using namespace std;
#include <deque>

void printDeque(deque<int>& d)
{
    for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    deque<int> d1;

    //尾插
    d1.push_back(10);
    d1.push_back(20);

    //头插
    d1.push_front(30);
    d1.push_front(40);

    printDeque(d1);

    //尾删
    d1.pop_back();
    printDeque(d1);

    //头删
    d1.pop_front();
    printDeque(d1);

    //insert插入
    d1.insert(d1.begin(), 100);
    printDeque(d1);

    d1.insert(d1.begin(), 2, 100);
    printDeque(d1);

    //按照区间插入
    deque<int> d2;
    d2.push_back(1);
    d2.push_back(2);
    d2.push_back(3);
    d1.insert(d1.begin(), d2.begin(), d2.end());
    printDeque(d1);

    //删除
    deque<int>::iterator it = d1.begin();
    it++;
    d1.erase(it);
    printDeque(d1);

    //按区间删除
    d1.erase(d1.begin(), d1.end());
    printDeque(d1);

    //清空
    d1.clear();
    printDeque(d1);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.3.6 deque数据存取

作用:进行deque容器数据的存取

函数原型

  • at(int idx); //返回索引idx所指的数据

  • operator[];//返回索引idx所指的数据

  • front(); //返回容器中第一个数据元素

  • back(); //返回容器中最后一个数据元素

#include <iostream>
using namespace std;
#include <deque>

void test01()
{
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_front(30);
    d1.push_front(40);

    //[]方式访问
    for (int i = 0; i < d1.size(); i++)
    {
        cout << d1[i] << " ";
    }
    cout << endl;

    //at方式访问
    for (int i = 0; i < d1.size(); i++)
    {
        cout << d1.at(i) << " ";
    }
    cout << endl;

    cout << "d1的第一个元素:" << d1.front() << endl;
    cout << "d1的最后一个元素:" << d1.back() << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.3.7 deque排序

作用:用算法实现对deque容器进行排序操作

函数原型

  • sort(iterator beg, iterator end) //beg和end区间内元素进行排序
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>

void printDeque(deque<int>& d)
{
    for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_front(30);
    d1.push_front(40);

    cout << "sort - before" << endl;
    printDeque(d1);

    sort(d1.begin(), d1.end());  //默认排序规则:从小到大 升序
    cout << "sort - after" << endl;
    printDeque(d1);
}

int main()
{
    test01();
    system("pause");
    return 0;
}
3.4 案例 - 后续更新
3.5 stack容器
3.5.1 stack基本概念

stack是一种先进后出的数据结构,它只有一个出口

栈中只有顶端的元素才可被外界使用,因此栈不允许遍历操作

在这里插入图片描述

3.5.2 stack常用接口

作用:常用对外接口

构造函数 - 函数原型:

stack<T> stk;           //采用模板类实现,stack对象的默认构造函数
  • stack(const stack &stk); //拷贝构造函数

赋值操作- 函数原型:

  • stack& operator=(const stack &stk); //重载等号操作符

数据存取 - 函数原型:

  • push(elem); //栈顶新增元素

  • pop(); //栈顶移除第一个元素

  • top(); //返回栈顶元素

大小操作 - 函数原型:

  • empty(); //判断堆栈是否为空

  • size(); //返回栈大小

#include <iostream>
using namespace std;
#include <stack>

void test01()
{
    stack<int> s;

    //入栈
    s.push(10);
    s.push(20);
    s.push(30);
    s.push(40);

    //出栈
    while (!s.empty())
    {
        cout << "栈顶元素为:" << s.top() << endl;

        s.pop();
    }
    cout << "栈的大小为:" << s.size() << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/527055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14届蓝桥杯 C/C++ B组 T5 接龙排序 (最长上升子序列DP+优化)

不难发现这是一个LIS问题&#xff0c;但是如果直接套用LIS的模版&#xff0c;在数据范围到达 1 e 5 1e5 1e5 的情况下&#xff0c;就只能够得到一半的分数&#xff0c;所以我们需要对其进行优化。 首先给出暴力的代码&#xff1a; #include<iostream> using namespace…

Linux虚拟网络设备深度解析:使用场景、分类与开发者指南

Linux虚拟网络设备支撑着各种复杂的网络需求和配置&#xff0c;从基础的网络桥接到高级的网络隔离和加密&#x1f510;。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览&#xff0c;同时提出了一种合理的分类&#xff0c;并指出应用开发人员应该着重掌握的…

vue2/vue3手写专题——实现双向绑定/响应式拦截/虚拟DOM/依赖收集

目录 vue双向绑定 请手动实现一个简单的双向绑定功能&#xff0c;要求实现以下功能&#xff1a; 1.使用原生javaScript 2.使用vue非v-model方式实现 思考&#xff1a;vue为什么要做双向绑定&#xff1f; 虚拟DOM/Render函数 将给定html片段写出Virtual Dom结构、并尝试挂载到页…

【面试】运算器-⑪搜索旋转排序数组

先存一下后面要用的字符⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ 33. 搜索旋转排序数组 感谢力扣&#xff01; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了…

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动&#xff08;Character Movement&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

S32K324 数据初始化Rom到Ram Copy的方式

文章目录 前言基础知识ld文件中的段定义ld文件中的符号定义 ld定义copy地址范围启动文件中的定义Copy的使用总结 前言 之前一直不理解在ld文件中加__xxx_ram_start,__xxx_rom_start,__xxx_rom_end这些的作用&#xff0c;也不清楚原理。前几天遇到一个内存copy的问题&#xff0…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

软件设计师——数据库

数据库 三级模式两级映像关系模型基本术语关系模型中的关系完整性约束 三级模式两级映像 概念模式&#xff08;也称模式&#xff09;对应基本表 外模式&#xff08;也称用户模式或子模式&#xff09;对应视图 内模式&#xff08;也称存储模式&#xff09;对应存储文件 两级映像…

SL1581耐压30V芯片 24V转5V/2.4A

SL1581是一款专为24V转5V/2.4A应用设计的耐压30V芯片。这款芯片采用了先进的电源管理技术和高效能的转换电路&#xff0c;为电子设备提供了稳定、可靠的电源输出。 首先&#xff0c;SL1581芯片具有出色的耐压性能&#xff0c;能够在高达30V的电压下稳定工作。这使其非常适合在需…

RFID涉密载体柜 RFID智能文件柜系统

涉密载体管控RFID智能柜&#xff08;载体柜DW-G101R&#xff09;通过对涉密物资、设备进行RFID唯一标识并放置于RFID设备涉密物资柜柜体&#xff0c;通过定位每台设备每件涉密物资的位置&#xff0c;实现涉密物资审批、自助借还、防盗等出入库全流程自动化管理。主要管理对象移…

Vulnhub:MHZ_CXF: C1F

目录 信息收集 arp-scan nmap nikto WEB web信息收集 dirmap gobuster ssh登录 提权 获得初始立足点 系统信息收集 横向渗透 提权 信息收集 arp-scan ┌──(root㉿ru)-[~/桌面] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:…

产品经理和项目经理的区别

1. 前言 本文深入探讨了产品经理与项目经理在职责、关注点以及所需技能方面的显著区别。产品经理主要负责产品的规划、设计和市场定位,强调对用户需求的深刻理解和产品创新的推动;而项目经理则侧重于项目的执行、进度控制和资源管理,确保项目按时、按质、按预算完成。两者在…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

python中的split()用法

在Python中&#xff0c;split() 是一个字符串方法&#xff0c;用于将字符串按照指定的分隔符分割成一个列表。如果没有提供分隔符&#xff0c;那么它会默认按照任何空白字符&#xff08;如空格、换行符、制表符等&#xff09;进行分割。 这里是 split() 方法的一些基本用法&am…

德兰梅尔:耐高温热销的膜元件亮相2024上海国际生物发酵展

德兰梅尔&#xff1a;耐高温热销的膜元件盛装亮相2024上海国际生物发酵展&#xff0c;8月7-9号上海新国际博览中心与您不见不散&#xff01; 据了解&#xff0c;从成立至今&#xff0c;德兰梅尔一直专注膜技术、膜产品的开发生产。在中国市场上&#xff0c;德兰梅尔刚步入中国…

代码随想录算法训练营33期 第三十一天(补29) | 491. 非递减子序列、46. 全排列、47. 全排列 II

491. 非递减子序列 class Solution { public:vector<int> path;vector<vector<int>> result;void BackTracking(vector<int>& nums, int index){if(path.size()>2){result.push_back(path);}unordered_set<int> usedSet;for (int iindex…

nandgame中的asm编程 Escape Labyrinth(逃离迷宫)

先翻译题目&#xff1a; 逃离迷宫计算机被困在火星上的迷宫中。编写一个程序&#xff0c;让它逃离迷宫。计算机配备了连接的轮子和前方障碍物探测器。与轮子和探测器的输入/输出是内存映射在地址7FFF上&#xff1a;对外设的输出信号&#xff1a; 位 设置为1代表&#xff1a; 2…

高精度原边控制离线式PWM功率开关芯片D3820的特征和详细的工作原理介绍

D3820是一款高精度原边控制离线式PWM功率开关。本文主要介绍D3820的特征和详细的工作原理&#xff0c;对反激式隔离AC-DC开关电源提供较为详细的测试过程。 特 点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制&#xff0c;无需TL431和光耦 3、欠压锁定&#xff08…

2024mathorcup妈妈杯数学建模A题思路模型

2024mathorcup妈妈杯数学建模A题思路模型&#xff1a;比赛开始后第一时间更新&#xff0c;更新见文末名片&#xff0c;下面对2022年B题进行介绍&#xff1a; 2022Mathorcup B题题目介绍 ​ B题无人仓的搬运机器人调度问题本题考在无人仓内的仓库管理问题之一&#xff0c;搬运机…

mos管开关出现尖峰的原理? mos管开关的时候cs会出现尖峰,请问这是什么原因?

MOS管在开关过程中出现尖峰现象&#xff0c;通常是由于电路中的寄生参数和快速电压变化引起的。以下是一些导致尖峰出现的主要原因和原理&#xff1a; 寄生电容 在MOS管的源极&#xff08;S&#xff09;和漏极&#xff08;D&#xff09;之间存在寄生电容&#xff0c;这个电容在…