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;
}
相关推荐
熬了夜的程序员12 小时前
【LeetCode】82. 删除排序链表中的重复元素 II
数据结构·算法·leetcode·链表·职场和发展·矩阵·深度优先
熬了夜的程序员13 小时前
【LeetCode】83. 删除排序链表中的重复元素
算法·leetcode·链表
_dindong17 小时前
牛客101:链表
数据结构·c++·笔记·学习·算法·链表
小欣加油1 天前
leetcode 143 重排链表
数据结构·c++·算法·leetcode·链表
猫梦www1 天前
力扣21:合并两个有序链表
数据结构·算法·leetcode·链表·golang·力扣
一匹电信狗2 天前
【LeetCode_160】相交链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
陌路202 天前
S4双向链表
数据结构·链表
sulikey2 天前
C++的STL:深入理解 C++ 的 std::initializer_list
开发语言·c++·stl·list·initializerlist·c++标准库
小白.cpp2 天前
list链表容器
数据结构·链表·list