• C++学习笔记(二十四)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第二十四篇博客。

    本篇博客介绍了C++的vector容器和deque容器。

    本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

    目录

    vector容器

    vector基本概念

    vector构造函数

    vector赋值操作

    vector容量和大小

    vector插入和删除

    vector数据存取

    vector互换容器

    vector预留空间

    deque容器

    deque基本概念

    deque构造函数

    deque赋值操作

    deque大小操作

    deque插入和删除

    deque数据存取

    排序操作


    vector容器

    vector基本概念

    vector容器数据结构和数组很相似,也称为单端数组。但是数组是静态空间,vector可以动态扩展。动态扩展不是在原空间后续接新空间,而是找更大的内存空间,然后将原数据拷贝至新空间。

    vector容器的迭代器支持随机访问。

    vector构造函数

    使用vector容器需要包含vector头文件。

    vector v创建一个vector容器,存放T类型数据,容器名称为v。

    vector(v.begin(),v.end())将v.begin()到v.end()之间的元素拷贝给本身。

    vector(n,elem)将n个elem拷贝给本身。

    vector(const vector &vec)是拷贝构造函数。

    vector容器名.begin()是开始位置,vector容器名.end()是结束位置。

    vector::iterator是vector容器的迭代器。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v1;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. v1.push_back(i);
    10. }
    11. for (vector<int>::iterator it = v1.begin(); it < v1.end(); it += 1) {
    12. cout << *it << " ";
    13. }
    14. cout << endl;
    15. vector<int> v2(v1.begin(), v1.end());
    16. for (vector<int>::iterator it = v2.begin(); it < v2.end(); it += 1) {
    17. cout << *it << " ";
    18. }
    19. cout << endl;
    20. vector<int> v3(10, 5);
    21. for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
    22. cout << *it << " ";
    23. }
    24. cout << endl;
    25. vector<int> v4(v3);
    26. for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
    27. cout << *it << " ";
    28. }
    29. cout << endl;
    30. return 0;
    31. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    5   5   5   5   5   5   5   5   5   5
    5   5   5   5   5   5   5   5   5   5

    vector赋值操作

    vector& operator=(const vector &vec)重载赋值运算符=。

    assign(beg,end)将beg到end的区间的数据拷贝给本身(包括beg,不包括end)。

    assign(n,elem)将n个elem拷贝赋值给本身。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v1;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. v1.push_back(i);
    10. }
    11. for (vector<int>::iterator it = v1.begin(); it < v1.end(); it += 1) {
    12. cout << *it << " ";
    13. }
    14. cout << endl;
    15. vector<int> v2;
    16. v2 = v1;
    17. for (vector<int>::iterator it = v2.begin(); it < v2.end(); it += 1) {
    18. cout << *it << " ";
    19. }
    20. cout << endl;
    21. vector<int> v3;
    22. v3.assign(v2.begin(), v2.end());
    23. for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
    24. cout << *it << " ";
    25. }
    26. cout << endl;
    27. vector<int> v4;
    28. v4.assign(10, 12);
    29. for (vector<int>::iterator it = v4.begin(); it < v4.end(); it += 1) {
    30. cout << *it << " ";
    31. }
    32. cout << endl;
    33. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    12   12   12   12   12   12   12   12   12   12

    vector容量和大小

    empty()判断是否为空,空为true,不空为false。

    capacity()返回容器的容量。

    size()返回容器中元素的个数。

    resize(int num)重新指定容器长度为num,如果容器变长,以默认值填充新位置,如果容器变短,就删除超出容器长度的元素。这里的默认值在int类型下是0。

    resize(int num,elem)重新指定容器长度为num,如果容器变长,就以elem的值填充新位置,如果容器变短就删除超出容器长度的元素。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. v.push_back(i);
    10. }
    11. vector<int>::iterator it;
    12. for(it = v.begin();it < v.end();it += 1){
    13. cout << *it << " ";
    14. }
    15. cout << endl;
    16. cout << v.empty() << endl;
    17. cout << v.capacity() << endl;
    18. cout << v.size() << endl;
    19. v.resize(15);
    20. for (it = v.begin(); it < v.end(); it += 1) {
    21. cout << *it << " ";
    22. }
    23. cout << endl;
    24. cout << v.empty() << endl;
    25. cout << v.capacity() << endl;
    26. cout << v.size() << endl;
    27. v.resize(20, 10);
    28. for (it = v.begin(); it < v.end(); it += 1) {
    29. cout << *it << " ";
    30. }
    31. cout << endl;
    32. cout << v.empty() << endl;
    33. cout << v.capacity() << endl;
    34. cout << v.size() << endl;
    35. v.resize(10);
    36. for (it = v.begin(); it < v.end(); it += 1) {
    37. cout << *it << " ";
    38. }
    39. cout << endl;
    40. cout << v.empty() << endl;
    41. cout << v.capacity() << endl;
    42. cout << v.size() << endl;
    43. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    0
    13
    10
    1   2   3   4   5   6   7   8   9   10   0   0   0   0   0
    0
    19
    15
    1   2   3   4   5   6   7   8   9   10   0   0   0   0   0   10   10   10   10   10
    0
    28
    20
    1   2   3   4   5   6   7   8   9   10
    0
    28
    10

    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)删除迭代器指向位置pos的元素。

    erase(const_iterator start,const_iterator end)删除迭代器从start到end的元素。

    clear()清空容器。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v;
    7. v.push_back(10);
    8. v.push_back(20);
    9. v.push_back(30);
    10. v.push_back(40);
    11. v.push_back(50);
    12. for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
    13. cout << *it << " ";
    14. }
    15. cout << endl;
    16. v.pop_back();
    17. v.pop_back();
    18. for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
    19. cout << *it << " ";
    20. }
    21. cout << endl;
    22. v.insert(v.begin(), 5);
    23. v.insert(v.begin() + 2, 3, 15);
    24. for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
    25. cout << *it << " ";
    26. }
    27. cout << endl;
    28. v.erase(v.begin() + 3);
    29. v.erase(v.begin() + 5);
    30. for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
    31. cout << *it << " ";
    32. }
    33. cout << endl;
    34. return 0;
    35. }

    程序的输出是:

    10   20   30   40   50
    10   20   30
    5   10   15   15   15   20   30
    5   10   15   15   20

    vector数据存取

    at(int idx)返回索引是idx的数据。

    operator[]返回方括号内索引的数据。

    front()返回容器第一个元素。

    back()返回容器最后一个元素。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v;
    7. v.push_back(50);
    8. v.push_back(75);
    9. v.push_back(25);
    10. v.push_back(15);
    11. v.push_back(55);
    12. int i;
    13. for (i = 0; i < v.size(); i += 1) {
    14. cout << v[i] << " ";
    15. }
    16. cout << endl;
    17. for (i = 0; i < v.size(); i += 1) {
    18. cout << v.at(i) << " ";
    19. }
    20. cout << endl;
    21. cout << v.front() << endl;
    22. cout << v.back() << endl;
    23. return 0;
    24. }

    程序的输出是:

    50   75   25   15   55
    50   75   25   15   55
    50
    55

    vector互换容器

    swap(vec)将vec与本身的元素互换。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. vector<int> v1;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. v1.push_back(i);
    10. }
    11. vector<int> v2;
    12. for (i = 10; i > 0; i -= 1) {
    13. v2.push_back(i);
    14. }
    15. for (i = 0; i < v1.size(); i += 1) {
    16. cout << v1[i] << " ";
    17. }
    18. cout << endl;
    19. for (i = 0; i < v2.size(); i += 1) {
    20. cout << v2[i] << " ";
    21. }
    22. cout << endl;
    23. v1.swap(v2);
    24. for (i = 0; i < v1.size(); i += 1) {
    25. cout << v1[i] << " ";
    26. }
    27. cout << endl;
    28. for (i = 0; i < v2.size(); i += 1) {
    29. cout << v2[i] << " ";
    30. }
    31. cout << endl;
    32. return 0;
    33. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    10   9   8   7   6   5   4   3   2   1
    10   9   8   7   6   5   4   3   2   1
    1   2   3   4   5   6   7   8   9   10

    vector预留空间

    reserve(int len)预留len个元素长度,预留位置不初始化且不可访问。
     

    deque容器

    deque基本概念

    deque是双端数组,可以对头端进行插入和删除操作。

    vector对于头部的插入删除效率低,且数据越大效率越低。deque对于头部的插入和删除比vector快。vector访问元素的速度比deque快。

    deque内有中控器,维护每段缓冲区的内容,缓冲区中存放数据。中控器维护每个缓冲区地址,使得deque像一片连续的内存空间。

    deque构造函数

    deque deq创建了一个deque容器,存放T类型数据,名称是deq。

    deque(beg,end)将beg到end区间的元素拷贝给本身。

    deque(n,elem)将n个elem拷贝给本身。

    deque(const deque &deq)是拷贝构造函数。

    deque容器名.begin()是开始位置,deque容器名.end()是结束位置。

    deque::iterator是deque容器的迭代器。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. deque<int> d1;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. d1.push_back(i);
    10. }
    11. for (deque<int>::iterator it = d1.begin(); it < d1.end(); it += 1) {
    12. cout << *it << " ";
    13. }
    14. cout << endl;
    15. deque<int> d2(d1);
    16. for (deque<int>::iterator it = d2.begin(); it < d2.end(); it += 1) {
    17. cout << *it << " ";
    18. }
    19. cout << endl;
    20. deque<int> d3(d2.begin(), d2.end());
    21. for (deque<int>::iterator it = d3.begin(); it < d3.end(); it += 1) {
    22. cout << *it << " ";
    23. }
    24. cout << endl;
    25. deque<int> d4(10, 10);
    26. for (deque<int>::iterator it = d4.begin(); it < d4.end(); it += 1) {
    27. cout << *it << " ";
    28. }
    29. cout << endl;
    30. return 0;
    31. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    10   10   10   10   10   10   10   10   10   10

    deque赋值操作

    deque& operator=(const deque&deq)重载等号操作符。

    assign(beg,end)将beg到end的数据拷贝给本身。(包括beg不包括end)

    assign(n,elem)将n个elem拷贝给本身。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. deque<int> d1;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. d1.push_back(i);
    10. }
    11. deque<int> d2;
    12. d2 = d1;
    13. for (deque<int>::iterator it = d1.begin(); it < d1.end(); it += 1) {
    14. cout << *it << " ";
    15. }
    16. cout << endl;
    17. for (deque<int>::iterator it = d2.begin(); it < d2.end(); it += 1) {
    18. cout << *it << " ";
    19. }
    20. cout << endl;
    21. deque<int> d3;
    22. d3.assign(d2.begin(), d2.end());
    23. for (deque<int>::iterator it = d3.begin(); it < d3.end(); it += 1) {
    24. cout << *it << " ";
    25. }
    26. cout << endl;
    27. deque<int> d4;
    28. d4.assign(10, 25);
    29. for (deque<int>::iterator it = d4.begin(); it < d4.end(); it += 1) {
    30. cout << *it << " ";
    31. }
    32. cout << endl;
    33. return 0;
    34. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    1   2   3   4   5   6   7   8   9   10
    25   25   25   25   25   25   25   25   25   25

    deque大小操作

    empty()判断是否为空,空返回true,不空返回false。

    size()返回容器元素个数。

    resize(num)重新指定容器长度为num,如果容器变长以默认值填充新位置,如果容器变短就删除超出容器长度的元素。

    resize(num,elem)重新指定容器长度为num,如果容器变长,就以elem值填充新位置,如果容器变短就删除超出容器长度的元素。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. deque<int> d;
    7. int i;
    8. for (i = 1; i <= 10; i += 1) {
    9. d.push_back(i);
    10. }
    11. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    12. cout << *it << " ";
    13. }
    14. cout << endl;
    15. cout << d.empty() << endl;
    16. cout << d.size() << endl;
    17. d.resize(15);
    18. cout << d.size() << endl;
    19. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    20. cout << *it << " ";
    21. }
    22. cout << endl;
    23. d.resize(20, 20);
    24. cout << d.size() << endl;
    25. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    26. cout << *it << " ";
    27. }
    28. cout << endl;
    29. d.resize(5);
    30. cout << d.size() << endl;
    31. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    32. cout << *it << " ";
    33. }
    34. cout << endl;
    35. return 0;
    36. }

    程序的输出是:

    1   2   3   4   5   6   7   8   9   10
    0
    10
    15
    1   2   3   4   5   6   7   8   9   10   0   0   0   0   0
    20
    1   2   3   4   5   6   7   8   9   10   0   0   0   0   0   20   20   20   20   20
    5
    1   2   3   4   5

    deque插入和删除

    push_back(elem)在容器末尾添加elem。

    push_front(elem)在容器头部添加elem。

    pop_back()删除容器最后一个数据。

    pop_front()删除容器第一个数据。

    insert(pos,elem)在pos位置插入elem。

    insert(pos,n,elem)在pos位置插入n个elem。

    insert(pos,beg,end)在pos位置插入从beg到end区间的数据(包括beg不包括end)。

    clear()清空容器。
    erase(beg,end)删除beg到end区间的数据(包括beg不包括end)。

    erase(pos)删除pos位置的数据。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. deque<int> d;
    7. d.push_back(10);
    8. d.push_back(20);
    9. d.push_back(30);
    10. d.push_back(40);
    11. d.push_back(50);
    12. d.push_front(100);
    13. d.push_front(200);
    14. d.push_front(300);
    15. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    16. cout << *it << " ";
    17. }
    18. cout << endl;
    19. d.pop_back();
    20. d.pop_back();
    21. d.pop_front();
    22. d.pop_front();
    23. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    24. cout << *it << " ";
    25. }
    26. cout << endl;
    27. d.insert(d.begin() + 1, 50);
    28. d.insert(d.begin() + 2, 75);
    29. d.insert(d.begin() + 4, 15);
    30. d.insert(d.begin() + 6, 5, 25);
    31. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    32. cout << *it << " ";
    33. }
    34. cout << endl;
    35. d.erase(d.begin() + 11);
    36. for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
    37. cout << *it << " ";
    38. }
    39. cout << endl;
    40. return 0;
    41. }

    程序的输出是:

    300   200   100   10   20   30   40   50
    100   10   20   30
    100   50   75   10   15   20   25   25   25   25   25   30
    100   50   75   10   15   20   25   25   25   25   25

    deque数据存取

    at(int index)返回索引为index的数据。

    operator[]返回索引为括号内值的数据。

    front()返回第一个元素。

    back()返回最后一个元素。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. deque<int> d;
    7. d.push_back(45);
    8. d.push_back(65);
    9. d.push_back(25);
    10. d.push_back(35);
    11. d.push_front(150);
    12. d.push_front(350);
    13. int i;
    14. for (i = 0; i < d.size(); i += 1) {
    15. cout << d[i] << " ";
    16. }
    17. cout << endl;
    18. for (i = 0; i < d.size(); i += 1) {
    19. cout << d.at(i) << " ";
    20. }
    21. cout << endl;
    22. cout << d.front() << endl;
    23. cout << d.back() << endl;
    24. return 0;
    25. }

    程序的输出是:

    350   150   45   65   25   35
    350   150   45   65   25   35
    350
    35

    排序操作

    sort(iterator beg,iterator end)对区间内元素进行排序。默认升序排序,需要包含algorithm头文件。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. deque<int> d;
    8. d.push_back(75);
    9. d.push_back(95);
    10. d.push_back(85);
    11. d.push_front(15);
    12. d.push_front(45);
    13. int i;
    14. for (i = 0; i < d.size(); i += 1) {
    15. cout << d.at(i) << " ";
    16. }
    17. cout << endl;
    18. sort(d.begin(), d.end());
    19. for (i = 0; i < d.size(); i += 1) {
    20. cout << d.at(i) << " ";
    21. }
    22. cout << endl;
    23. }

    程序创建了deque容器,并使用了sort进行排序。程序的输出是:

    45   15   75   95   85
    15   45   75   85   95

  • 相关阅读:
    grep wc 与 管道符
    数据结构每日亿题(二)
    数据中台:数据中台技术架构详解
    从字节码层面解析Java语言--i与i--的区别
    数据库学习资源整理
    【学习笔记】 - 基础数据结构 :Link-Cut Tree(进阶篇)
    K8S 资源编排文件简介
    css - - - - - 去除图片默认的白色背景(混合模式 mix-blend-mode)
    浏览器插件不会装?保姆级教程分享!
    [Acwing | 周赛] 第70场周赛
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126400422