个人主页
⭐个人专栏——C++学习
点击关注一起学习C语言

目录

导读

1. list基本介绍

2. list构造函数

3. list迭代器

4. list容量

5. list的修改操作

6. list排序


导读

今天我们来正式学习list,了解它的一些基本使用方法。我们在之前C语言的数据结构部分,有讲过单链表和双向循环链表,有兴趣的小伙伴可以点进专栏看一下。

1. list基本介绍

C++中的list是一个双向链表容器。它允许在任意位置进行快速插入和删除操作,并且能够在常量时间内访问任意元素。

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

2. list构造函数

在C++中,可以使用不同的构造函数来创建list对象。  

1. 默认构造函数:

使用默认构造函数创建一个空的list对象。

	std::list<T> myList;

2. 复制构造函数:

使用另一个list对象otherList创建一个新的list对象,并复制所有元素。

std::list<T> myList(otherList);

3. 范围构造函数:

使用指定范围内的元素创建一个新的list对象。firstlast是指向范围内第一个元素和最后一个元素的迭代器。

std::list<T> myList(first, last);

4. 初始化列表构造函数:

使用初始化列表中的值来创建一个新的list对象。

std::list<T> myList = {val1, val2, val3, ...};

示例:

int main() 
{
    // 默认构造函数
    list<int> myList1;

    // 复制构造函数
    list<int> myList2(myList1);

    // 范围构造函数
    list<int> myList3(myList1.begin(), myList1.end());

    // 初始化列表构造函数
    list<int> myList4 = { 1, 2, 3, 4, 5 };

    // 遍历list并打印所有元素
    for (int num : myList4) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

3. list迭代器

list容器提供了双向迭代器(bidirectional iterators),可以用于遍历和操作容器中的元素。list的迭代器支持前进(++)和后退(--)操作,并且可以跳转到任意位置。

以下是一些常用的list迭代器操作:

  1. begin():返回指向第一个元素的迭代器。
  2. end():返回指向最后一个元素之后位置的迭代器。
  3. rbegin():返回指向最后一个元素的逆向迭代器。
  4. rend():返回指向第一个元素之前位置的逆向迭代器。

示例: 

int main() 
{
    list<int> myList = { 1, 2, 3, 4, 5 };

    // 正向迭代器遍历list
    cout << "正向遍历list: ";
    list<int>::iterator itr;
    for (itr = myList.begin(); itr != myList.end(); ++itr) 
    {
        cout << *itr << " ";
    }
    cout << endl;

    // 逆向迭代器遍历list
    cout << "逆向遍历list: ";
    list<int>::reverse_iterator ritr;
    for (ritr = myList.rbegin(); ritr != myList.rend(); ++ritr) 
    {
        cout << *ritr << " ";
    }
    cout << endl;

    return 0;
}

4. list容量

使用size()函数来获取容器的大小。

empty()函数返回一个bool类型的值,如果容器为空,则返回true;否则返回false

int main() 
{
    std::list<int> myList = { 1, 2, 3 };

    cout << "容器大小:" << size(myList) << endl;
    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    myList.clear();
    cout << "容器大小:" << size(myList) << endl;

    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    return 0;
}

5. list的修改操作

list是一种双向链表容器,提供了多种修改容器的操作函数。下面是一些常见的list的修改操作函数:

1. 添加元素:

  • 使用push_back(element)函数将元素添加到列表的末尾。
  • 使用push_front(element)函数将元素添加到列表的开头。
  • 使用insert(iterator, element)函数在指定的迭代器位置之前插入元素。

2. 删除元素:

  • 使用pop_back()函数删除列表的最后一个元素。
  • 使用pop_front()函数删除列表的第一个元素。
  • 使用erase(iterator)函数删除指定迭代器位置的元素。
  • 使用erase(start_iterator, end_iterator)函数删除指定范围内的元素。

3. 修改元素:

  • 使用迭代器操作符*来直接修改列表中的元素。

 

int main() 
{
    list<int> my_list = { 1, 2, 3 };

    // 添加元素
    my_list.push_back(4);
    my_list.push_front(0);
    auto it = my_list.insert(++my_list.begin(), 5);
    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 删除元素
    my_list.pop_back();
    my_list.pop_front();
    my_list.erase(it);

    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 修改元素
    *++my_list.begin() = 6;

    // 打印列表元素
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    return 0;
}

6. list排序

在C++中,可以使用list容器的sort()成员函数对列表进行排序。sort()函数会根据元素的默认比较函数(operator<)来进行排序。如果列表中的元素是自定义类型,可以通过在类中重载小于操作符(operator<)来定义自定义的比较方式。

int main() 
{
    list<int> my_list = { 5, 2, 8, 1, 4 };

    // 对列表进行升序排序
    my_list.sort();

    // 打印排序后的列表
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    // 对列表进行降序排序
    my_list.sort(greater<int>());

    for (const auto& elem : my_list)
    {
        cout << elem << " ";
    }
    cout << endl;
    return 0;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部