• C++:vector


    目录

    一.vector的定义

    1.vector构造函数

    2.vector遍历

    3.vector的增容

    (1)两种版本下的扩容

    (2)单次增容增多少的问题分析:(不用考虑内存对齐)

    (3)vector开空间用reserve还是resize?——用reserve

    (4)string vector等都有一个特点,删除数据,一般是不会主动缩容

    4.vector的几个常用函数

    (1)insert,erase

    (2)swap

    (3)clear 

     (4)vector中没有find函数,要用算法中的find函数

    (5)算法中的排序 sort 


    一.vector的定义

    定义:可以动态增长的数组

    1.vector构造函数

    size_type 就是被typedef的size_t

     

    1. #include
    2. #include
    3. using namespace std;
    4. void test_vector1()
    5. {
    6. vector<int> v1;
    7. v1.push_back(1);
    8. v1.push_back(2);
    9. v1.push_back(3);
    10. v1.push_back(4);
    11. vector<double> v2;
    12. v2.push_back(1.1);
    13. v2.push_back(2.2);
    14. v2.push_back(3.3);
    15. vector v3;
    16. v3.push_back("李白"); //单参数的构造函数支持隐式类型转换:
    17. v3.push_back("杜甫"); //string s="hello world";先构造再拷贝构造
    18. v3.push_back("苏轼");
    19. v3.push_back("白居易");
    20. vector<int> v4(10, 5);
    21. vector v5(++v3.begin(), --v3.end()); //迭代器,此处是"杜甫","苏轼"
    22. string s = "hello world";
    23. vector<char> v6(s.begin(), s.end());
    24. }

    2.vector遍历

    与string遍历大致相同

    1. void test_vector2()
    2. {
    3. // 遍历
    4. vector<int> v;
    5. v.push_back(1);
    6. v.push_back(2);
    7. v.push_back(3);
    8. v.push_back(4);
    9. // 1、下表+[]
    10. for (size_t i = 0; i < v.size(); ++i)
    11. {
    12. v[i] += 1;
    13. cout << v[i] << " ";
    14. }
    15. cout << endl;
    16. // 2.迭代器
    17. vector<int>::iterator it = v.begin();
    18. while (it != v.end())
    19. {
    20. *it -= 1;
    21. cout << *it << " ";
    22. ++it;
    23. }
    24. cout << endl;
    25. // 3.范围for
    26. for (auto e : v)
    27. {
    28. cout << e << " ";
    29. }
    30. cout << endl;
    31. }

    3.vector的增容

    (1)两种版本下的扩容

    vs下面-- PJ版本——1. 5倍增容
    linux g++ SGI版本——2倍增容
     

    (2)单次增容增多少的问题分析:(不用考虑内存对齐)

    即为什么vs下扩容按1.5倍扩容,linux的g++扩容按2倍扩容?

    单次增容越多,插入N个值,增容次数越少,效率就越高,但是浪费空间就越多;
    单次增容越少,浪费空间就少了,但是会导致频繁增容,效率低下。

    因此不一定是1.5倍或者2倍,也可能是3,4倍,只是1.5或2倍是一个比较平衡的值。

    (3)vector开空间用reserve还是resize?——用reserve

    如果知道要开多大空间,就用reserve提前开好。

    如果用resize就是开空间并初始化,比如foo.resize(100); 开100个int空间,全部初始化成0,如果再foo.push_back(i); 就是在这100个空间以后再加数据,因为前100个已经有数据了

    1. void test_vector3()
    2. {
    3. //vector v;
    4. //cout << v.max_size() << endl;
    5. size_t sz;
    6. std::vector<int> foo;
    7. foo.reserve(100); //如果知道要开多大空间,就用reserve提前开好
    8. //foo.resize(100);
    9. sz = foo.capacity();
    10. std::cout << "making foo grow:\n";
    11. for (int i = 0; i < 100; ++i) {
    12. foo.push_back(i);
    13. if (sz != foo.capacity()) {
    14. sz = foo.capacity();
    15. std::cout << "capacity changed: " << sz << '\n';
    16. }
    17. }
    18. }

    (4)string vector等都有一个特点,删除数据,一般是不会主动缩容

    若非要缩容,那就用函数 shrink_to_fit() ,但是要慎用,少用,表面是缩容_capacity——>_size,实际它的底层是开辟一块_size的空间,并把内容拷贝过来,实际上是用时间换空间了,但是我们一般是不差空间的,而且通常是用空间换时间,所以说不建议时间换空间的做法,即:少用 shrink_to_fit() 函数。

    1. void test_vector3()
    2. {
    3. //vector v;
    4. //cout << v.max_size() << endl;
    5. size_t sz;
    6. std::vector<int> foo;
    7. foo.reserve(100);
    8. //foo.resize(100);
    9. sz = foo.capacity();
    10. std::cout << "making foo grow:\n";
    11. for (int i = 0; i < 100; ++i) {
    12. foo.push_back(i);
    13. if (sz != foo.capacity()) {
    14. sz = foo.capacity();
    15. std::cout << "capacity changed: " << sz << '\n';
    16. }
    17. }
    18. //vector countV;
    19. //countV.resize(100, 1);
    20. //countV.resize(10);
    21. // string vector等都有一个特点,删除数据,一般是不会主动缩容
    22. foo.resize(10);
    23. cout << foo.size() << endl;
    24. cout << foo.capacity() << endl;
    25. // 慎用、少用
    26. foo.shrink_to_fit();
    27. cout << foo.size() << endl;
    28. cout << foo.capacity() << endl;
    29. }

    4.vector的几个常用函数

    (1)insert,erase

     他们都是不支持下标增加或删除的,都是用的迭代器

    返回值是iterator是为了解决迭代器失效,这个后面再详细说。

     

    1. void test_vector4()
    2. {
    3. // 遍历
    4. vector<int> v;
    5. v.push_back(1);
    6. v.push_back(2);
    7. v.push_back(3);
    8. v.push_back(4);
    9. v.insert(v.begin(), -1);
    10. v.insert(v.begin(), -2);
    11. v.insert(v.begin(), -3);
    12. for (auto e : v)
    13. {
    14. cout << e << " ";
    15. }
    16. cout << endl;
    17. v.insert(v.begin()+7, 300);
    18. //v.insert(v.begin()+8, 300);
    19. for (auto e : v)
    20. {
    21. cout << e << " ";
    22. }
    23. cout << endl;
    24. v.erase(v.begin());
    25. v.erase(v.begin());
    26. for (auto e : v)
    27. {
    28. cout << e << " ";
    29. }
    30. cout << endl;
    31. }

    (2)swap

    交换两个vector类对象指向的空间,例如:v1.swap(v2);

    (3)clear 

    清掉全部数据

     

     (4)vector中没有find函数,要用算法中的find函数

     algorithm——算法                #include

    1. void test_vector5()
    2. {
    3. // 遍历
    4. vector<int> v;
    5. v.push_back(1);
    6. v.push_back(2);
    7. v.push_back(3);
    8. v.push_back(4);
    9. //vector::iterator pos = find(v.begin(), v.end(), 3);
    10. auto pos = find(v.begin(), v.end(), 3); //类型太长可以用auto
    11. if (pos != v.end())
    12. {
    13. cout << "找到了" << endl;
    14. v.erase(pos);
    15. }
    16. else
    17. {
    18. cout << "没有找到" << endl;
    19. }
    20. for (auto e : v)
    21. {
    22. cout << e << " ";
    23. }
    24. cout << endl;
    25. }

    (5)算法中的排序 sort 

    #include
     

     sort默认是升序

    1. void test_vector5()
    2. {
    3. // 遍历
    4. vector<int> v;
    5. v.push_back(1);
    6. v.push_back(2);
    7. v.push_back(4);
    8. v.push_back(0);
    9. v.push_back(9);
    10. v.push_back(3);
    11. v.push_back(1);
    12. // 默认是升序
    13. sort(v.begin(), v.end()); // <
    14. for (auto e : v)
    15. {
    16. cout << e << " ";
    17. }
    18. cout << endl;
    19. }

      排降序,仿函数
    关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲

    1. void test_vector5()
    2. {
    3. // 遍历
    4. vector<int> v;
    5. v.push_back(1);
    6. v.push_back(2);
    7. v.push_back(4);
    8. v.push_back(0);
    9. v.push_back(9);
    10. v.push_back(3);
    11. v.push_back(1);
    12. // 默认是升序
    13. //sort(v.begin(), v.end()); // <
    14. // 排降序,仿函数
    15. // 关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲
    16. // sort(v.begin(), v.end(), greater()); // >
    17. greater<int> g;
    18. sort(v.begin(), v.end(), g); // >
    19. for (auto e : v)
    20. {
    21. cout << e << " ";
    22. }
    23. cout << endl;
    24. }

    5.题目:杨辉三角

    118. 杨辉三角

    给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

    在「杨辉三角」中,每个数是它左上方和右上方的数的和。

    示例 1:

    输入: numRows = 5
    输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
    

    示例 2:

    输入: numRows = 1
    输出: [[1]]

     解法:

     

  • 相关阅读:
    我的创作纪念日
    通过Oracle Enterprise Manager管理OCI上的RAC
    6 JS 和 Jquery 删除标签元素
    武汉便宜的ov通配符https证书
    Chapter8.2:非线性控制系统分析
    Python基础-面向对象编程之特性(property)
    【LeetCode】图文+实例弄清KMP算法
    SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中
    vue3 el-table表格数据过多加载卡死优化问题
    基于微信小程序奶茶店在线点单管理系统ssm框架-计算机毕业设计
  • 原文地址:https://blog.csdn.net/zhang_si_hang/article/details/125892669