c++ list

1.构造函数

构造函数

// list<T> lst;
// list(beg, end); // 区间构造
// list(n, elem); // 元素构造   
// list(const list &lst); // 拷贝构造
csharp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
using namespace std;

void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    list<int> l; // 默认构造
    l.push_back(10);
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    printList(l);

    // 区间构造
    list<int> l2(l.begin(), l.end());
    printList(l2);

    // 拷贝构造
    list<int> l3(l2);
    printList(l3);

    // 元素构造
    list<int> l4(10, 100);
    printList(l4);

}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

2 赋值和交换

// 函数原型:

// assign(beg, end) // 将区间[beg, end)中的数据拷贝到本身

// assign(n, elem) // 将n个elem拷贝赋值给本身

// list &operator=(const list &L); // 重载=运算符

// swap(L) // 将L与本身的元素互换

csharp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;


void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    list<int> l; // 默认构造
    l.push_back(10);
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    printList(l);

    // assign(beg, end) // 将区间[beg, end)中的数据拷贝到本身
    list<int> l2;
    l2.assign(l.begin(), --l.end() );
    printList(l2);
    
    // assign(n, elem) // 将n个elem拷贝赋值给本身
    l2.assign(5, 100);
    cout << "L2 " << endl;
    printList(l2);

    // swap 
    l2.swap(l);
    cout << "l 的值" << endl;
    printList(l);
    cout << "l2的值" << endl;
    printList(l2);

}

int main(int argc, char const *argv[]) {
    

    test01();
    return 0;
}

3 list 大小操作

函数原型:

size() // 返回容器中元素的个数
empty() // 判断容器是否为空
resize(int num) // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem) // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
csharp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

//   list 大小操作

void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    list<int> l; // 默认构造
    l.push_back(10);
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    printList(l);

    if(l.empty()) {
        cout << "l is empty" << endl;
    }
    else{
        cout << "l is not empty" << endl;
    }
    cout << "l size = " << l.size() << endl;

    l.resize(10);
    printList(l);
    cout << "l size = " << l.size() << endl;

    l.resize(2);
    printList(l);
    cout << "l size = " << l.size() << endl;
    
    l.resize(10, 100);
    printList(l);
    

}

int main(int argc, char const *argv[]) {
    

    test01();
    return 0;
}

4 list 插入和删除

函数原型

puhsh_back(elem) 在容器尾部插入元素

pop_back() 删除容器最后一个元素

push_front(elem) 在容器头部插入元素

pop_front() 删除容器第一个元素

insert(pos, elem) // 在pos位置插入元素elem,返回新的数据位置

insert(pos,n,elem) // 在pos位置插入n个elem,无返回值

insert(pos,beg,end) // 在pos位置插入[beg,end)区间的数据,无返回值

clear() // 清空容器数据

erase(pos) // 删除pos位置的数据, 返回删除的元素的下一个位置

erase(beg,end) // 删除[beg,end)区间的数据,返回删除的元素的下一个位置

remove(value) // 删除容器中所有与value值匹配的元素

clear() // 清空容器数据

csharp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    list<int> L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    // 头插
    L1.push_front(100);
    L1.push_front(200);
    L1.push_front(300);
    // 300 200 100 10 20 30
    printList(L1);

    // 尾删
    L1.pop_back();
    // 300 200 100 10 20
    printList(L1);
    // 头删
    L1.pop_front();
    // 200 100 10 20
    printList(L1);

    // insert 插入
    list<int>::iterator it = L1.begin();
    L1.insert(++it, 1000);
    printList(L1);
    
    // 删除
    it = L1.begin();
    L1.erase(++it);
    printList(L1);

    // remove 删除所有值为777的元素
    L1.push_back(777);
    L1.push_back(777);
    L1.push_back(777);
    printList(L1);
    L1.remove(777);
    printList(L1);

    // 清空
    L1.clear();
    printList(L1);

}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

5. list数据存取

函数原型

// front() 返回第一个元素的引用
// back() 返回最后一个元素的引用
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

//   list数据存取

// 函数原型
// front() 返回第一个元素的引用
// back() 返回最后一个元素的引用

// 


void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}


void test01() {
    list<int> L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    printList(L1);

    // L1[0] 不可以访问
    // L1.at(0) 不可以访问
    // 原因是list本质是链表,不是连续线性空间存储数据,迭代器也不支持随机访问
    cout << "front: " << L1.front() << endl;

    cout << "back: " << L1.back() << endl;

    // 验证迭代器不支持随机访问
    list<int>::iterator it = L1.begin();
    it++;
    it--;
    // 不可以进行it+1 // 不支持随机访问

}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

6. list 反转和排序

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

//  list 反转和排序

// 函数原型
// sort() 返回第一个元素的引用
// reverse() 反转链表


void printList(const list<int> &L){
    for(list<int>::const_iterator it = L.begin(); it != L.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

bool myCompare(int v1, int v2){
    // 当前元素比参数大,则返回true
    return v1 > v2;
}

void test01() {
    list<int> L1;
    L1.push_back(10);
    L1.push_back(50);
    L1.push_back(30);
    printList(L1);

    // 反转
    L1.reverse();
    printList(L1);

    // 排序
    L1.sort(); // 默认从小到大
    printList(L1);
    L1.sort(myCompare); // 从大到小
    printList(L1);

    // 所有不支持随即访问的容器,不支持标准的sort算法
    // sort(L1.begin(), L1.end()); // 运行时报错

}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

7. 排序案例

案例描述: 将person自定义数据类型进行排序,Person中属性有 姓名 年龄 身高

排序规制: 按照年龄进行升序

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

//  list 排序案例
// 案例描述: 将person自定义数据类型进行排序,Person中属性有 姓名 年龄 身高
// 排序规制: 按照年龄进行升序


class Person{
public:
    Person(string name, int age, int height) {
        this->m_Age = age;
        this->m_Height = height;
        this->m_Name = name;
    }

    string m_Name;
    int m_Age;
    int m_Height;
};

void printList (list<Person> &L) {
    for(list<Person>::iterator it = L.begin(); it != L.end(); it++){
        cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << " 身高: " << it->m_Height << endl;
    }
    cout << endl;
}

bool comparePerson(Person &p1, Person &p2) {
    if(p1.m_Age == p2.m_Age) {
        // 年龄相同 按照身高降序
        return p1.m_Height > p2.m_Height;
    }
    // 年龄升序
    return p1.m_Age < p2.m_Age;
}

void test01() {
    list<Person> L;
    L.push_back(Person("刘备", 35, 180));
    L.push_back(Person("关羽", 35, 175));
    L.push_back(Person("赵云", 26, 160));
    L.push_back(Person("曹操", 45, 190));
    L.push_back(Person("张飞", 35, 170));
    L.push_back(Person("诸葛亮", 28, 175));

    //插入数据
    printList(L);

    //排序后
    L.sort(comparePerson);
    printList(L);

}

int main(int argc, char const *argv[]) {
    test01();
    return 0;
}
相关推荐
qq_447663055 小时前
java-----多线程
java·开发语言
a辰龙a5 小时前
【Java报错解决】警告: 源发行版 11 需要目标发行版 11
java·开发语言
听海边涛声5 小时前
JDK长期支持版本(LTS)
java·开发语言
IpdataCloud5 小时前
Java 获取本机 IP 地址的方法
java·开发语言·tcp/ip
MyMyMing5 小时前
Java的输入和输出
java·开发语言
Easonmax5 小时前
【javaSE】内部类(来自类和对象的补充)
开发语言·javascript·ecmascript
云夏之末5 小时前
【Java报错已解决】java.lang.UnsatisfiedLinkError
java·开发语言
li星野6 小时前
QT:图像上绘制图形
开发语言·qt
花落已飘6 小时前
RK3568中使用QT opencv(显示基础图像)
开发语言·qt·opencv
Mr_Xuhhh7 小时前
进程间通信
android·java·服务器·开发语言·数据库