• STL--vector(使用)


    目录

    vector的介绍

    vector的使用

    vector的定义

    构造函数构造

    拷贝构造函数构造

     迭代器构造

    vector的空间增长

    size和capacity 

    resize和reserve 

    empty 

    vector的迭代器

    begin和end 

    rbegin和rend

    vector的增删查改

    push_back和pop_back 

    insert和erase 

    find和swap

    vector的元素访问 

    []+下标

    at

    范围for

    迭代器

    迭代器失效的讨论 

    insert引起的迭代器失效

    erase引起的迭代器失效

    vector的介绍

    1. vector是表示可变大小数组的序列容器.
    2. vector就像数组一样,也采用连续存储空间来存储元素,也就意味着可以采用下标堆vector的元素进行访问.和数组一样,但是又不数组,他的大小是可以动态改变的而且他的大小会被容器自动处理.
    3. vector的本质使用动态分配数组来存储他的元素,当新的元素插入时,这个数组需要被重新分配大小.
    4. vector的空间分配策略:vector会分配一些额外的空间可以适应可能的增长,因为存储空间比实际需要的存储空间更大,不同的库采用不同的策略权衡空间的使用和分配.但是无论和分配,重新分配的都应该时对数组增长的间隔大小,以至于在尾插的时候实在常数的时间复杂度内完成的.
    5. 用于vector采取连续的空间来存储元素,与其他容器相比,vector在访问元素时更加高效,

    vector的使用

    vector的定义

    构造函数构造

    1. vector<int> first;//构造一个空的int类型容器
    2. vector<int> second(4, 100);//构造四个值为100的int类型容器

    拷贝构造函数构造

    	vector<int> fourth(third);//使用拷贝构造构造一个值和third一样的int类型的容器
    

     迭代器构造

    vector<int> third(second.begin(), second.end());//使用迭代器构造int的类型的容器
    

    vector的空间增长

    size和capacity 

    size是获取当前容器中有效元素的个数,capacity是获取当前容器的最大容量

    1. vector<int> v(10, 0);
    2. cout << v.size() << endl;//10 获取当前容器的有效元素的个数
    3. cout << v.capacity() << endl;//10 获取当前容器的最大容量

    resize和reserve 

    resize是改变容器中有效元素的个数,reserve是改变容器的最大容量

    resize使用规则:

    1. 当n大于当前容器的size时,将size扩大到该值,扩大元素为给出的第二个元素,若未给出默认为0(vector类的)
    2. 当n小于当前容器的size时,将size缩小到n

    reserve使用规则:

    1. 当n大于当前容器的capacity时,将capacity扩大到该值
    2. 当n小于当前容器的capacity时,什么也不做.
    1. void test3()
    2. {
    3. vector<int> v(10, 0);
    4. cout << v.size() << endl;//10
    5. cout << v.capacity() << endl;//10
    6. v.reserve(5);
    7. cout << v.size() << endl;//10
    8. cout << v.capacity() << endl;//10
    9. v.reserve(15);
    10. cout << v.size() << endl;//10
    11. cout << v.capacity() << endl;//10
    12. }
    13. void test4()
    14. {
    15. vector<int> v(10, 0);
    16. cout << v.size() << endl;//10
    17. cout << v.capacity() << endl;//10
    18. v.resize(5);
    19. cout << v.size() << endl;//5
    20. cout << v.capacity() << endl;//10
    21. v.resize(15);
    22. cout << v.size() << endl;//15
    23. cout << v.capacity() << endl;//15
    24. }

    empty 

    通过empty判断当前容器是否为空

    1. vector<int> v(10, 0);
    2. cout << v.empty() << endl;//0

    vector的迭代器

    begin和end 

    begin函数返回的时第一个元素的迭代器,end函数返回的时最后一个元素下一个位置的迭代器

    1. vector<int> v(10, 0);
    2. vector<int>::iterator it = v.begin();
    3. while (it != v.end())
    4. {
    5. cout << *it << " ";
    6. it++;
    7. }
    8. cout << endl;//遍历一遍

    rbegin和rend

    rbegin是返回的最后一个元素的迭代器,rend返回的是第一个元素前面的位置的迭代器

    1. vector<int> v(10, 0);
    2. vector<int>::reverse_iterator it = v.rbegin();
    3. while (it != v.rend())
    4. {
    5. cout << *it << " ";
    6. ++it;
    7. }
    8. cout << endl;//反向遍历一边

    vector的增删查改

    push_back和pop_back 

    push_back是在容器后面进行尾插,pop_back实在容器后面进行尾删

    1. vector<int> v;
    2. v.push_back(1);
    3. v.push_back(2);
    4. v.push_back(3);
    5. v.push_back(4);
    6. for (auto ch : v)
    7. {
    8. cout << ch << " ";
    9. }
    10. cout << endl;
    11. v.pop_back();
    12. v.pop_back();
    13. v.pop_back();
    14. for (auto ch : v)
    15. {
    16. cout << ch << " ";
    17. }
    18. cout << endl;

    insert和erase 

    通过insert可以在所给的迭代器位置插入一个或多个元素,通过erase可以在所给的迭代器位置删除一个或多个元素 .

    1. vector<int> v;
    2. v.push_back(1);
    3. v.push_back(2);
    4. v.push_back(3);
    5. v.push_back(4);
    6. v.push_back(5);
    7. v.insert(v.begin(), 0);//在开始位置插入一个0;
    8. v.insert(v.begin(), 2, -1);//在开始位置插入2个-1
    9. v.erase(v.begin());//删除元素第一个位置的元素
    10. v.erase(v.begin(), v.begin() + 2);//删除元素前2个位置的元素

    find和swap

    find函数需要给出一段迭代区间,和需要查找的元素,迭代区间是左闭右开的 .

    还需要注意其返回值,他在迭代区间内查找出第一个符合的并返回他的迭代器,若未找打则返回迭代区间的最后一个值.

    1. vector<int> v;
    2. v.push_back(1);
    3. v.push_back(2);
    4. v.push_back(3);
    5. v.push_back(4);
    6. v.push_back(5);
    7. vector<int>::iterator pos = find(v.begin(), v.end(),3);
    8. v.insert(pos, 0);
    9. for (auto ch : v)
    10. {
    11. cout << ch << " ";
    12. }
    13. cout << endl;
    14. auto pos1 = find(v.begin(), v.end(), 0);
    15. v.erase(pos1);
    16. for (auto ch : v)
    17. {
    18. cout << ch << " ";
    19. }
    20. cout << endl;

     swap函数则是交对象的内容

    1. vector<int>v1(5, 0);
    2. vector<int>v2(5, 1);
    3. v1.swap(v2);

    vector的元素访问 

    []+下标

    1. vector<int>v(10, 1);
    2. size_t len = v.size();
    3. for (int i = 0; i < len; i++)
    4. {
    5. cout << v[i] << " ";
    6. }
    7. cout << endl;

    at

    1. vector<int>v(10, 1);
    2. size_t len = v.size();
    3. for (int i = 0; i < len; i++)
    4. {
    5. cout<<v.at(i)<<" ";
    6. }
    7. cout << endl;

    范围for

    1. vector<int>v(10, 1);
    2. for (auto ch : v)
    3. {
    4. cout << ch << " ";
    5. }
    6. cout << endl;

    迭代器

    1. vector<int>v(10, 1);
    2. vector<int>::iterator it = v.begin();
    3. while (it != v.end())
    4. {
    5. cout << *it << " ";
    6. it++;
    7. }
    8. cout << endl;

    迭代器失效的讨论 

    迭代器的主要主要就是让我们在使用各个容器时不用关心底层的数据结构,而vector的迭代器在底层实际上就是一个指针.迭代器失效指针指向的空间被销毁了,此时指针指向的是一块被销毁的空间,如果在使用就在野指针了.

    insert引起的迭代器失效

    1. vector<int> v;
    2. v.push_back(1);
    3. v.push_back(2);
    4. v.push_back(3);
    5. v.push_back(4);
    6. v.push_back(5);
    7. vector<int>::iterator pos = find(v.begin(), v.end(), 3);
    8. v.insert(pos, 30);
    9. //1 2 30 3 4 5
    10. v.erase(pos);
    11. // 1 2 3 4 6

    erase引起的迭代器失效

    1. vector<int> v;
    2. v.push_back(1);
    3. v.push_back(2);
    4. v.push_back(3);
    5. v.push_back(4);
    6. v.push_back(5);
    7. v.push_back(6);
    8. vector<int>::iterator it = v.begin();
    9. while (it != v.end())
    10. {
    11. if (*it % 2 == 0)
    12. {
    13. v.erase(it);
    14. }
    15. it++;
    16. }

    思维导图:

     

  • 相关阅读:
    Python第四章 序列
    Stability derivatives
    华为手机的钱包里没有门钥匙要怎样弄
    【开源项目 - export-service】数据导出项目 之 简介
    python+vue+elementui大学生假期志愿者公益网站django
    mysql14
    docker安装与镜像基本操作
    C语言 - 你一定能看懂的三子棋详解(万字长文,傻瓜式解析)
    精灵图练习---pink老师课程
    【湖仓一体化】存OR算之争?SPL 我都要
  • 原文地址:https://blog.csdn.net/m0_70657810/article/details/132641660