1.序列式容器-vector&list

vector 是一个动态数组,方便存放所有类型的变量。顺序存放在内存空间里面,当预申请的空间不足时:①首先申请一片更大的内存空间②将原数据拷贝进新空间③释放原空间

如图1所示:

为什么要保留预留空间,原因是防止频繁的内存申请和释放,一般都会多申请两倍的空间。

vector常用方法:

cpp 复制代码
push_back()		//从尾部加入元素
pop_back()		//从尾部弹出元素
size()				//获取vector大小
insert()			//在指定位置插入元素
earse()			//删除指定元素
clear()			//情空vector

对vector其它操作:

cpp 复制代码
reverse()		//反转vec
sort()			//对vec里面的元素进行排序

示例代码:

cpp 复制代码
//
// Created by wsk on 25-10-20.
//
#ifndef VECTOR_H
#define VECTOR_H
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

inline void testvector()
{
    vector<int> vec(2,9);
    auto it1 = vec.begin();
    while (it1 != vec.end())
    {
        cout <<*it1<<" " ;
        ++it1;
    }
    cout << endl;
    cout << "size=" << vec.size() << endl;
    cout << "capacity=" << vec.capacity() << endl;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);
    cout << "size=" << vec.size() << endl;
    cout << "capacity=" << vec.capacity() << endl;
    vec.pop_back();
    vec.pop_back();// 9 9 1 2 3
    const auto it2 = find(vec.cbegin(), vec.cend(), 1);
    if (*it2)
    {
        vec.erase(it2);// 9 9 2 3
        // cout << *it2 << endl;// 2
    }
    auto it3 = vec.begin();
    while (it3 != vec.end())
    {
        cout <<*it3<<" " ;
        ++it3;
    }
    cout << endl;

    const auto it4 = find(vec.cbegin(), vec.cend(), 2);
    if (*it4)
    {
        vec.insert(it4, 3,7);// 9 9 7 7 7 2 3
    }
    for(int i= 0;i<vec.size();i++)
    {
        cout <<vec[i]<<" " ;
    }
    cout << endl;

    // reverse(vec.begin(), vec.end());// 反转
    sort(vec.begin(), vec.end());// 排序

    for(int i= 0;i<vec.size();i++)
    {
        cout <<vec[i]<<" " ;
    }
    cout << endl;
    vec.erase(vec.begin()+5);
    cout << vec[5]<<endl;
    vec.clear();
    cout << "size=" << vec.size() << endl;
    cout << "capacity=" << vec.capacity() << endl;
}
#endif //VECTOR_H

通过sort来自定义比较规则:

cpp 复制代码
// 内置比较器
sort(vec.begin(), vec.end(),less_equal<int>());// 默认行为,升序排序
sort(vec.begin(), vec.end(),greater_equal<int>());// 降序排序

// 函数指针
struct Person {
    std::string name;
    int age;
};
bool ageGreater(const Person& a, const Person& b) {
    return a.age > b.age;  // 年龄大的在前(降序)
}
std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}};
std::sort(people.begin(), people.end(), ageGreater);  // 传入函数指针

list 是一个双向链表,数据随机存取在内存里面,在逻辑上是有序的。

下面对插入操作进行简单的图解

list常用方法:

cpp 复制代码
push_back();
insert();
push_front();
erase();
clear();
unique();		// 连续相同的元素只保留一个
splice();		// 拼接两个链表
merge();		// 归并两个有序链表
reverse();
sort();

示例代码:

cpp 复制代码
//
// Created by wsk on 25-10-20.
//
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v1 = {3 ,4 ,5 ,8 ,11};
    list<int> mylist(1,0);
    list<int> mylist2(v1.begin(),v1.end());// 3 4 5 8 11
    // auto it = mylist2.begin();
    // while (it != mylist2.end())
    // {
    //     cout << *it << " ";
    //     ++it;
    // }
    // cout << endl;
    mylist.push_back(1);
    mylist.push_back(2);
    mylist.push_back(3);
    mylist.push_back(4);
    const auto it2 = find(mylist.begin(),mylist.end(),3);
    if (*it2)
    {
        mylist.insert(it2,99);// 0 1 2 99 3 4
    }
    // auto it = mylist.begin();
    // while (it != mylist.end())
    // {
    //     cout << *it << " ";
    //     ++it;
    // }
    auto it3= find(mylist.begin(), mylist.end(), 3);
    if (*it3)
    {
        // mylist.erase(it3);
        cout << *(mylist.erase(it3)) << endl;// 4
    }
    // auto it = mylist.begin();
    // while (it != mylist.end())
    // {
    //     cout << *it << " ";// 0 1 2 99 4
    //     ++it;
    // }
    auto it4 = find(mylist.begin(), mylist.end(), 99);
    if (*it4)
    {
        mylist.splice(it4,mylist2);// 拼接 0 1 2 3 4 5 8 11 99 4
    }
    // mylist.reverse();// 反转 4 99 11 8 5 4 3 2 1 0
    reverse(mylist.begin(),mylist.end());// 反转
    mylist.sort();// 排序 0 1 2 3 4 4 5 8 11 99
    // mylist2.sort();// 不能使用算法头文件里面的sort因为算法头文件里面默认的iterator是随机访问迭代器和链表里面的迭代器不一样
    // mylist.merge(mylist2);// 归并,前提是两个链表要有序 list:0 1 2 99 list2:3 ,4 ,5 ,8 ,11
    // mylist.unique();// 连续的相同元素只保留一个
    // mylist.remove(3);// 删除指定元素
    // mylist.clear();
    auto it = mylist.begin();
    while (it != mylist.end())
    {
        cout << *it << " ";
        ++it;
    }
    return 0;
}
相关推荐
Ka1Yan1 小时前
[链表] - 代码随想录 707. 设计链表
数据结构·算法·链表
Ka1Yan6 小时前
[链表] - 代码随想录 160. 相交链表
算法·leetcode·链表
Ka1Yan6 小时前
[链表] - 代码随想录 206. 反转链表
数据结构·链表
Ka1Yan7 小时前
[链表] - 代码随想录 203. 移除链表元素
数据结构·链表
有一个好名字8 小时前
力扣-奇偶链表
算法·leetcode·链表
Ka1Yan8 小时前
[链表] - 代码随想录 24. 两两交换链表中的节点
数据结构·链表
有一个好名字10 小时前
力扣-链表最大孪生和
算法·leetcode·链表
罗湖老棍子11 小时前
【例4-8】格子游戏(信息学奥赛一本通- P1347)
stl·图论·并查集·二维坐标压缩
jimy112 小时前
消息队列Message Queue(MQ),队列链表(queue),消费者,生产者
数据结构·链表
李日灐1 天前
C++STL:仿函数、模板(进阶) 详解!!:“伪装术”和模板特化、偏特化的深度玩法指南
开发语言·c++·后端·stl