从零开始的STL生活

参考cppreference

目录

array

头文件 #include <array>



std::array<int, 6> arr{1, 2, 3, 4, 5, 6};
// 设置元素
arr.at(1) = 10;
// 访问元素
std::cout << arr.at(1) << std::endl; // 输出 10
// 越界则抛出 std::out_of_range 类型的异常
 try {
    arr.at(10) = 100;
  } catch (const std::out_of_range& ex) {
    std::cout << ex.what() << std::endl; 
  }


operator[] 访问指定元素, 无边界检查

std::array<int, 6> arr{1, 2, 3, 4, 5, 6};
// 设置元素
arr[1] = 10;
// 访问元素
std::cout << arr[1] << std::endl; // 输出 10


front 访问第一个元素

std::array<int, 6> arr{1, 2, 3, 4, 5, 6};
// 访问第一个元素
std::cout << arr.front() << std::endl; // 输出 1


back 访问最后一个元素

std::array<int, 6> arr{1, 2, 3, 4, 5, 6};
// 访问最后一个元素
std::cout << arr.back() << std::endl; // 输出 6


data 直接访问底层连续存储

std::array<int, 5> arr{1, 2, 3, 4, 5};
// 返回一个指向底层连续存储的指针
// 使得范围[data(), data() + size()]始终为有效范围
  int* p = arr.data();
  for (int i = 0; i < arr.size(); i++)
  {
    std::cout << *(p + i) << " ";
  }
  std::cout << std::endl;

cbegin cend crbegin crend 为常量迭代器

  std::array<int, 5> arr{1, 2, 3, 4, 5};
  // 正向迭代器
  for (auto it = arr.begin(); it != arr.end(); it++)
  {
    std::cout << *it << " ";
    // 1 2 3 4 5 
  }
  std::cout << std::endl;
  // 反向迭代器
  for (auto it = arr.rend() - 1; it != arr.rbegin() - 1; it--)
  {
    std::cout << *it << " ";
    // 1 2 3 4 5 
  }
  std::cout << std::endl;
  std::array<int, 5> arr{1, 2, 3, 4, 5};
  若容器为空则为 true,否则为 false
  std::cout << std::boolalpha << "arr.empty() : " << arr.empty() << std::endl;
  // arr.empty() : false


size 返回元素数

  std::array<int, 5> arr{1, 2, 3, 4, 5};
  std::cout << "arr.size() : " << arr.size() << std::endl;
  // arr.size() : 5


max_size 返回可容纳的最大元素数

  std::array<int, 5> arr{1, 2, 3, 4, 5};
  // 因为每个 std::array<T, N> 都是固定大小容器,故 max_size 返回的值等于 N(亦为 size() 所返回的值)。
  std::cout << "arr.max_size() : " << arr.max_size() << std::endl;
  // arr.max_size() : 5
  std::array<int, 5> arr{1, 2, 3, 4, 5};
  arr.fill(10);
  for (auto it = arr.begin(); it!= arr.end(); it++)
  {
    std::cout << *it << " ";
    // 10 10 10 10 10
  }
  std::cout << std::endl;


swap 交换内容

  std::array<int, 5> arr1{1, 2, 3, 4, 5};
  std::array<int, 5> arr2{10, 20, 30, 40, 50};
  arr1.swap(arr2);
  for (auto it = arr1.begin(); it!= arr1.end(); it++)
  {
    std::cout << *it << " ";
    // 10 20 30 40 50
  }
  std::cout << std::endl;
  for (auto it = arr2.begin(); it!= arr2.end(); it++)
  {
    std::cout << *it << " ";
    // 1 2 3 4 5
  }
  std::cout << std::endl;
  std::array<int, 5> arr{1, 2, 3, 4, 5};
  // 设置值
  // get返回值为引用
  std::get<0>(arr) = 10;
  // 访问值
  std::cout << std::get<0>(arr) << std::endl; // 10


std::swap(std::array) 特化std::swap算法

  std::array<int, 5> arr1{1, 2, 3, 4, 5};
  std::array<int, 5> arr2{10, 20, 30, 40, 50};
  std::swap(arr1, arr2);
  for (auto it = arr1.begin(); it!= arr1.end(); it++)
  {
    std::cout << *it << " ";
    // 10 20 30 40 50
  }
  std::cout << std::endl;
  for (auto it = arr2.begin(); it!= arr2.end(); it++)
  {
    std::cout << *it << " ";
    // 1 2 3 4 5
  }
  std::cout << std::endl;


to_array 从内建数组创建std::array对象
C++20支持