• C++ STL进阶与补充(vector容器)


    Vector又称为单端数组,与数组不同的是,vector可以动态扩展。

    动态扩展并不是在原有空间中续接新空间,而是寻找更大的空间,然后将原数据拷贝到新空间,释放原空间。

    1、vector构造函数

    Vector<T> v; //采用模板实现,默认构造函数

    Vector(v.begin(),v.end()); //将v[gegin(),end()]区间中的元素拷贝给本身

    Vector(n,elem); //将n个elem拷贝给本身

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

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v1; //默认构造,无参构造
    15. for (int i = 0; i < 10; i++)
    16. {
    17. v1.push_back(i);
    18. }
    19. printVector(v1);
    20. //通过区间方式构造
    21. vector<int>v2(v1.begin(), v1.end());
    22. printVector(v2);
    23. //n个elem的构造
    24. vector<int> v3(10, 100);
    25. printVector(v3);
    26. //拷贝构造
    27. vector<int> v4(v3);
    28. printVector(v4);
    29. }
    30. int main()
    31. {
    32. test01();
    33. }

    2、vector赋值操作

    功能:为vector容器进行赋值

    可以用“=”号进行赋值,也可使用函数assign赋值。

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v1; //默认构造,无参构造
    15. for (int i = 0; i < 10; i++)
    16. {
    17. v1.push_back(i);
    18. }
    19. printVector(v1);
    20. //等号赋值
    21. vector<int> v2;
    22. v2 = v1;
    23. printVector(v2);
    24. //assign方式
    25. vector<int> v3;
    26. v3.assign(v1.begin(),v1.end());
    27. printVector(v3);
    28. }
    29. int main()
    30. {
    31. test01();
    32. }

    3、vector容量和大小

    Empty()

    判断容器是否为空

    Capacity()

    容器的容量

    Size()

    返回容器中元素的个数

    Resize(int num)

    重新制定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。

    Resize(int num, elem)

    重新制定容器的长度为num,若容器变长,则以elem填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v1; //默认构造,无参构造
    15. for (int i = 0; i < 10; i++)
    16. {
    17. v1.push_back(i);
    18. }
    19. printVector(v1);
    20. //判断是否为空
    21. if (v1.empty())
    22. {
    23. cout << "v1 为空!" << endl;
    24. }
    25. else
    26. {
    27. cout << "v1 不为空!" << endl;
    28. cout << "v1的容量为多少" << v1.capacity() << endl; //将输出13
    29. cout << "v1的大小为多少" << v1.size() << endl; //将输出10
    30. }
    31. //重新指定大小
    32. v1.resize(15);
    33. printVector(v1); //将在后面添加5个默认值,默认值为0
    34. v1.resize(5);
    35. printVector(v1); //如果重新制定的短了,超出部分会被删掉
    36. }
    37. int main()
    38. {
    39. test01();
    40. }

    4、vector插入和删除

    Push_back(elem)

    尾部插入元素elem

    Pop_back()

    删除最后一个元素

    Insert(const_iterator pos, elem)

    迭代器向指定位置pos插入元素elem

    Insert(const_iterator pos, int count elem)

    迭代器向指定位置pos插入count个元素elem

    Erase(const_iterator pos)

    删除迭代器指向的元素

    Erase(const_iterator start, const_iterator end)

    删除迭代器从strat到end之间的所有元素

    Clear()

    删除容器中所有元素

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v1;
    15. v1.push_back(10); //尾插法插入数据
    16. v1.push_back(20);
    17. v1.push_back(30);
    18. v1.push_back(40);
    19. //遍历
    20. printVector(v1);
    21. //删除尾部元素
    22. v1.pop_back();
    23. printVector(v1);
    24. //插入,第一个参数是迭代器
    25. v1.insert(v1.begin(), 100);
    26. printVector(v1);
    27. //插入多个数据
    28. v1.insert(v1.begin(), 2,1000);
    29. printVector(v1);
    30. //删除特定位置的元素
    31. v1.erase(v1.begin());
    32. printVector(v1);
    33. //删除区间的元素
    34. v1.erase(v1.begin()+1,v1.end()-2);
    35. printVector(v1);
    36. }
    37. int main()
    38. {
    39. test01();
    40. }

    5、vector数据存取

    At(int idx)

    通过索引idx指向数据

    operator[]

    []返回,和数组一样

    Front

    返回容器中第一个数据元素

    Back

    返回容器中最后一个数据元素

    6、vector互换容器

    功能:实现两个容器内的元素交换。

    实际用途:巧用swap可以收缩内存空间

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v1;
    15. for (int i = 0; i < 10; i++)
    16. {
    17. v1.push_back(i);
    18. }
    19. cout << "交换前:" << endl;
    20. printVector(v1);
    21. vector<int> v2;
    22. for (int i = 10; i >0; i--)
    23. {
    24. v2.push_back(i);
    25. }
    26. printVector(v2);
    27. cout << "交换后:" << endl;
    28. v1.swap(v2); //进行交换
    29. printVector(v1);
    30. printVector(v2);
    31. }
    32. void test02() //利用swap收缩内存空间
    33. {
    34. vector<int> v;
    35. for (int i = 0; i < 10000; i++)
    36. {
    37. v.push_back(i);
    38. }
    39. cout << "v的容量:" << v.capacity() << endl;
    40. cout << "v的大小:" << v.size() << endl;
    41. v.resize(3);
    42. cout << "v的容量:" << v.capacity() << endl; //容量不会变成3
    43. cout << "v的大小:" << v.size() << endl; //大小会变成3
    44. //利用swap收缩内存
    45. vector<int>(v).swap(v); //先创建一个匿名对象,然后与之交换
    46. //匿名对象在该行执行完之后将被系统自动回收
    47. cout << "v的容量:" << v.capacity() << endl;
    48. cout << "v的大小:" << v.size() << endl;
    49. }
    50. int main()
    51. {
    52. //test01();
    53. test02();
    54. }

    7、vector预留空间

    功能:减少vector在动态扩展容量时的扩展次数。预留位置不会初始化,元素不可访问。

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. void printVector(vector<int>& v)
    5. {
    6. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    7. {
    8. cout << *it << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test01()
    13. {
    14. vector<int> v;
    15. v.reserve(10000); //上来直接分很长的空间,如果不预留,num会等于24
    16. int num = 0; //统计内存开辟次数
    17. int* p = NULL;
    18. for (int i = 0; i < 10000; i++)
    19. {
    20. v.push_back(i);
    21. if (p != &v[0])
    22. {
    23. p = &v[0];
    24. num++;
    25. }
    26. }
    27. cout << num << endl;
    28. }
    29. int main()
    30. {
    31. test01();
    32. }
  • 相关阅读:
    Java中有序单链表的构建
    Nginx网站服务
    跟着AI学AI_07张量、数组、矩阵
    02-git创建版本库
    计算机网络各层协议总结
    读 RocketMQ 源码,学习并发编程三大神器
    苹果ipad触控笔哪个好?ipad手写笔推荐
    图像处理之图像的离散余弦变换
    可以ping通,防火墙也关闭了,但是ssh无法登录解决方案
    JS深入学习笔记 - 第三章.变量作用域与内存
  • 原文地址:https://blog.csdn.net/Lao_tan/article/details/125468209