【C++】list的使用方法

list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。 与vector相比, 它允许快速的插入和删除,但是随机访问却比较慢.
首先我们来看一下list都有哪些接口:
这里写图片描述
list中常用的函数
front() 返回第一个元素
back():返回最后一个元素
注意:list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。
begin():返回指向第一个元素的迭代器,通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator
end() 返回末尾的迭代器 ,可以调用list容器的 end() 函数来得到list末端下一位置。
pop_back():删除最后一个元素
pop_front():删除第一个元素
push_back():在list的末尾添加一个元素
push_front():在list的头部添加一个元素

void print_list(const list<int>& l)
{
    list<int>::const_iterator it = l.begin();
    while (it != l.end()) //end()相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
}
void test_list()
{
    list<int> l;

    //从头部向list中插入数据
    l.push_front(3);
    l.push_front(2);
    l.push_front(1);

    //从尾部向list中插入数据
    l.push_back(4);
    l.push_back(5);
    l.push_back(6);
    print_list(l);

    //从头部删除数据
    l.pop_front();

    //从尾部删除数据
    l.pop_back();

    print_list(l);

    //获取第一个元素和最后一个元素
    cout << "第一个元素:" << l.front() << endl;
    cout << "最后一个元素:" << l.back() << endl;
}

运行结果:
这里写图片描述
assign():给list赋值

void test_list()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    l1.push_back(5);

    //将 l1中元素变为3个10。
    l1.assign(3, 10);
    print_list(l1);

    list<int> l2;
    l2.push_back(7);
    l2.push_back(8);
    l2.push_back(9);
    l2.push_back(10);

    //将l2中的从l2.begin()到l2.end()之间的数值赋值给l1
    l1.assign(l2.begin(), l2.end());
    print_list(l1);
}

clear():删除所有元素
empty():判断list是否为空,如果list是空的则返回true
erase(): 删除一个元素

    //将l1的第一个元素删除。
    l1.erase(l1.begin()); 
    // 将l1的从begin()到end()之间的元素删除
    l1.erase(l1.begin(), l1.end());

insert():插入一个元素到list中

    //在l1的开始位置插入100。
    l1.insert(l1.begin(), 100); 
    //在l1的开始位置插入2个100。
    l1.insert(l1.begin(), 2, 100); 
    //在l1的开始位置插入l2的从开始到结束的所有位置的元素
    l1.insert(l1.begin(), l2.begin(), l2.end());

max_size():返回list能容纳的最大元素大小

    list<int> l1;
    cout << l1.max_size() << endl;

这里写图片描述
merge():合并两个list

void test_list()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    print_list(l1);

    list<int> l2;
    l2.push_back(4);
    l2.push_back(5);
    l2.push_back(6);
    l1.merge(l2);
    print_list(l1);
    print_list(l2);
}

这里写图片描述
remove():从list删除指定元素,如果该元素存在,则将list中的所有该元素删除,如果不存在,则不发生任何变化

list<int> l1;
    l1.push_back(1);
    l1.push_back(4);
    l1.push_back(2);
    l1.push_back(4);
    l1.push_back(3);
    l1.push_back(4);
    print_list(l1);
    l1.remove(4);
    print_list(l1);
    l1.remove(40);
    print_list(l1);

这里写图片描述
resize():改变list的大小
reverse():把list的元素逆置
size():返回list中的元素个数
sort():给list排序
swap():交换两个list
unique():删除list中重复的元素

void test_list()
{
    list<int> l1;
    l1.push_back(3);
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(4);
    l1.push_back(4);
    l1.push_back(2);
    print_list(l1);

    list<int> l2;
    l2.push_back(4);
    l2.push_back(5);
    l2.push_back(6);

    //将l1大小改为8
    l1.resize(8);
    cout << l1.size() << endl;

     //逆置l1   
    l1.reverse();
    print_list(l1);

    //给l1排序
    l1.sort();
    print_list(l1);

    //交换l1和l2
    l1.swap(l2);
    print_list(l1);

    //删除l2中重复的元素
    l2.unique();
    print_list(l2);
}

这里写图片描述

以下是建立顺序表结构来存放26个英文字母组成的线性表的C语言程序: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 26 // 定义顺序表的最大长度 typedef struct { char data[MAXSIZE]; // 存放数据元素的数组 int length; // 当前长度 } SqList; // 初始化顺序表 void InitList(SqList *L) { L->length = 0; } // 在顺序表的任意一个位置插入新的字母 int ListInsert(SqList *L, int i, char e) { int j; if (i < 1 || i > L->length + 1) { return 0; // 插入位置不合法 } if (L->length == MAXSIZE) { return 0; // 顺序表已满 } for (j = L->length; j >= i; j--) { L->data[j] = L->data[j - 1]; // 将第i个位置及之后的元素后移 } L->data[i - 1] = e; // 插入新元素 L->length++; // 长度加1 return 1; } // 删除顺序表的任意一个位置的字母 int ListDelete(SqList *L, int i) { int j; if (i < 1 || i > L->length) { return 0; // 删除位置不合法 } for (j = i; j < L->length; j++) { L->data[j - 1] = L->data[j]; // 将第i个位置及之后的元素前移 } L->length--; // 长度减1 return 1; } int main() { SqList L; InitList(&L); // 初始化顺序表 int i; for (i = 0; i < MAXSIZE; i++) { L.data[i] = 'a' + i; // 将26个英文字母存入顺序表 L.length++; } printf("顺序表中的元素为:"); for (i = 0; i < L.length; i++) { printf("%c ", L.data[i]); // 输出顺序表中的元素 } printf("\n"); ListInsert(&L, 5, 'A'); // 在第5个位置插入新元素'A' printf("插入新元素后,顺序表中的元素为:"); for (i = 0; i < L.length; i++) { printf("%c ", L.data[i]); // 输出顺序表中的元素 } printf("\n"); ListDelete(&L, 10); // 删除第10个位置的元素 printf("删除元素后,顺序表中的元素为:"); for (i = 0; i < L.length; i++) { printf("%c ", L.data[i]); // 输出顺序表中的元素 } printf("\n"); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值