std::list

std::list

介绍

成员函数

非成员函数

介绍

// list 模板定义
template<class T, class Allocator = std::allocator<T>> class list;

namespace pmr {
    template< class T >
    using list = std::list<T, std::pmr::polymorphic_allocator<T>>;
}
  • std::list 介绍摘选自 cppreference.com 中文网 std::list 介绍
  • std::list 是支持常数时间从容器任何位置插入和移除元素的容器
  • 不支持快速随机访问。它通常实现为双向链表
  • 与 std::forward_list 相比,此容器提供双向迭代但在空间上效率稍低
  • 在 list 内或在数个 list 间添加、移除和移动元素不会是迭代器或引用失效
  • 迭代器只有在对应元素被删除时才会失效

成员函数

构造析构
#include <QCoreApplication>
#include <iostream>
#include <list>
#include <string>

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
    std::cout << msg << " : ";
    for (int val : deq)
      std::cout << val << "\t";

    std::cout << "\n";
  };

  using list_int = std::list<int>; // 声明整型列表类型

  list_int test{10, 20, 30, 40, 50}; // 测试数据
  Print("test", test);

  list_int l1; // 默认构造函数
  Print("l1", l1);

  std::allocator<int> alloc;
  list_int l2(alloc); // 设置分配器
  Print("l2", l2);

  list_int l3(10, -1, alloc); // 设置数量,值,分配器
  Print("l3", l3);

  list_int l4(10); // 设置数量
  Print("l4", l4);

  list_int l5(test.begin(), test.end(), alloc); // 使用迭代器初始化容器
  Print("l5", l5);

  list_int l6(l5); // 使用列表初始化
  Print("l6", l6);

  list_int l7(l6, alloc); // 使用列表初始化,指定分配器
  Print("l7", l7);

  list_int l8(std::move(l7)); // 使用移动构造
  Print("l8", l8);

  list_int l9(std::move(l8), alloc); // 使用移动构造,指定分配器
  Print("l9", l9);

  list_int l10{1, 2, 3, 4, 5, 6, 7, 8, 9}; // 使用初始化列表构造
  Print("l10", l10);

  std::initializer_list<int> lt{1, 2, 3, 4, 5, 6, 7, 8, 9};
  list_int l11(lt); // 使用初始化列表构造
  Print("l11", l11);
  
  list_int l12 = test; // 使用operator = 赋值,也可创建后使用 assign 函数赋值
  Print("l12", l12);
  // 析构函数默认
  return 0; // a.exec();
}

输出结果:
test : 10 20 30 40 50
l1 :
l2 :
l3 : -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
l4 : 0 0 0 0 0 0 0 0 0 0
l5 : 10 20 30 40 50
l6 : 10 20 30 40 50
l7 : 10 20 30 40 50
l8 : 10 20 30 40 50
l9 : 10 20 30 40 50
l10 : 1 2 3 4 5 6 7 8 9
l11 : 1 2 3 4 5 6 7 8 9
l12 : 10 20 30 40 50

元素访问
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
    std::cout << msg << " : ";
    for (int val : deq)
      std::cout << val << "\t";

    std::cout << "\n";
  };

  using list_int = std::list<int>; // 声明整型列表类型

  list_int test{10, 20, 30, 40, 50}; // 测试数据
  Print("test", test);

  std::cout << "index 0 : " << test.front() << std::endl;
  std::cout << "index 0 : " << test.front() << std::endl;
  std::cout << "index 4 : " << test.back() << std::endl;
  std::cout << "index 4 : " << test.back() << std::endl;

  return 0; // a.exec();
}

输出结果:
test : 10 20 30 40 50
index 0 : 10
index 0 : 10
index 4 : 50
index 4 : 50

迭代器
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  using list_int = std::list<int>; // 声明整型列表类型

  list_int test{10, 20, 30, 40, 50};      // 测试数据
  list_int::iterator iter = test.begin(); // 返回指向起始的迭代器
  for (; iter != test.end(); iter++) {
    std::cout << *iter << "\t";
  }
  std::cout << "\n";

  list_int::const_iterator citer = test.begin(); // 返回指向起始的迭代器,const
  for (; citer != test.end(); citer++) {
    std::cout << *citer << "\t";
  }
  std::cout << "\n";

  list_int::reverse_iterator riter = test.rbegin(); // 返回指向末尾的逆向迭代器
  for (; riter != test.rend(); riter++) {
    std::cout << *riter << "\t";
  }
  std::cout << "\n";

  list_int::const_reverse_iterator criter =
      test.crbegin(); // 返回指向末尾的 const 逆向迭代器,const
  for (; criter != test.crend(); criter++) {
    std::cout << *criter << "\t";
  }
  std::cout << "\n";

  return 0; // a.exec();
}

输出结果:
10 20 30 40 50
10 20 30 40 50
50 40 30 20 10
50 40 30 20 10

容量
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  using list_int = std::list<int>;   // 声明整型列表类型
  list_int test{10, 20, 30, 40, 50}; // 测试数据

  std::cout << std::boolalpha << "test.empty : " << test.empty()
            << "\n"; // 检查容器是否为空
  std::cout << std::boolalpha << "test.size : " << test.size()
            << "\n"; // 返回容纳的元素数
  std::cout << std::boolalpha << "test.max_size : " << test.max_size()
            << "\n";   // 返回可容纳的最大元素数,和平台有关

  return 0; // a.exec();
}

输出结果:
test.empty : false
test.size : 5
test.max_size : 768614336404564650

修改器
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
    std::cout << msg << " : ";
    for (int val : deq)
      std::cout << val << "\t";

    std::cout << "\n";
  };

  using list_int = std::list<int>;   // 声明整型列表类型
  list_int test{10, 20, 30, 40, 50}; // 测试数据
  Print("test", test);
  test.clear(); //清除内容
  Print("test", test);

  test.insert(test.begin(), 10); //  插入元素
  Print("test", test);

  test.emplace(test.begin(), 20); //原位构造元素
  Print("test", test);

  test.erase(test.begin()); //擦除元素
  Print("test", test);

  test.push_back(30); // 将元素添加到容器末尾
  Print("test", test);

  test.emplace_back(40); // 在容器末尾就地构造元素
  Print("test", test);

  test.pop_back(); // 移除末元素
  Print("test", test);

  test.push_front(50); //插入元素到容器起始
  Print("test", test);

  test.emplace_front(60); //在容器头部原位构造元素
  Print("test", test);

  test.pop_front(); // 移除首元素
  Print("test", test);

  test.resize(10); // 改变容器中可存储元素的个数
  Print("test", test);

  list_int l1;
  l1.swap(test); // 交换内容
  Print("test", test);
  Print("l1", l1);

  return 0; // a.exec();
}

输出结果:
test : 10 20 30 40 50
test :
test : 10
test : 20 10
test : 10
test : 10 30
test : 10 30 40
test : 10 30
test : 50 10 30
test : 60 50 10 30
test : 50 10 30
test : 50 10 30 0 0 0 0 0 0 0
test :
l1 : 50 10 30 0 0 0 0 0 0 0

操作
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
    std::cout << msg << " : ";
    for (int val : deq)
      std::cout << val << "\t";

    std::cout << "\n";
  };

  using list_int = std::list<int>;   // 声明整型列表类型
  list_int l1{10, 20, 30, 40, 50};   // 测试数据
  list_int l2{50, 80, 90, 100, 110}; // 测试数据
  Print("l1", l1);
  Print("l2", l2);

  l1.merge(l2); // 合并二个已排序列表
  Print("l1", l1);
  Print("l2", l2);

  list_int l3{50, 90, 150};
  l1.splice(l1.end(), std::move(l3), l3.begin(),
            l3.end()); // 从另一个list中移动元素
  Print("l1", l1);

  l1.remove(100);
  Print("l1", l1);

  l1.remove_if(
      [&](int o) -> bool { return o > 100; }); // 移除满足特定标准的元素
  Print("l1", l1);

  l1.reverse(); // 将该链表的所有元素的顺序反转
  Print("l1", l1);

  l1.unique(); // 删除连续的重复元素
  Print("l1", l1);

  l1.sort(); // 对元素进行排序
  Print("l1", l1);

  return 0; // a.exec();
}

输出结果:
l1 : 10 20 30 40 50
l2 : 50 80 90 100 110
l1 : 10 20 30 40 50 50 80 90 100 110
l2 :
l1 : 10 20 30 40 50 50 80 90 100 110 50 90 150
l1 : 10 20 30 40 50 50 80 90 110 50 90 150
l1 : 10 20 30 40 50 50 80 90 50 90
l1 : 90 50 90 80 50 50 40 30 20 10
l1 : 90 50 90 80 50 40 30 20 10
l1 : 10 20 30 40 50 50 80 90 90

非成员函数

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
    std::cout << msg << " : ";
    for (int val : deq)
      std::cout << val << "\t";

    std::cout << "\n";
  };

  using list_int = std::list<int>; // 声明整型列表类型
  list_int l1{1, 2, 3, 4, 5};      // 初始化列表构造函数
  list_int l2{1, 2, 3, 4, 6};

  std::cout.setf(std::ios::boolalpha);
  std::cout << "l1 == l2 : " << (l1 == l2) << std::endl;
  std::cout << "l1 != l2 : " << (l1 != l2) << std::endl;
  std::cout << "l1 > l2 : " << (l1 > l2) << std::endl;
  std::cout << "l1 >= l2 : " << (l1 >= l2) << std::endl;
  std::cout << "l1 < l2 : " << (l1 < l2) << std::endl;
  std::cout << "l1 <= l2 : " << (l1 <= l2) << std::endl;
  std::cout.unsetf(std::ios::boolalpha);
  // c++20 废弃以上操作符重载,提供三路运算符 operator <=> ()

  Print("l1", l1);
  Print("l2", l2);
  std::swap(l1, l2);
  Print("l1", l1);
  Print("l2", l2);

  return 0; // a.exec();
}

输出结果:
l1 == l2 : false
l1 != l2 : true
l1 > l2 : false
l1 >= l2 : false
l1 < l2 : true
l1 <= l2 : true
l1 : 1 2 3 4 5
l2 : 1 2 3 4 6
l1 : 1 2 3 4 6
l2 : 1 2 3 4 5

起始

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值