[STL剖析] 02 STL容器有哪些?用法?

考虑篇幅过长,使用连载方式,学习STL容器,请关注STL专题,点点赞!

一 STL容器

  • 序列容器(sequence containers)
    vector
    list
    deque
    stack
    queue
    heap
    priority_queue
    slist
  • 关联容器
    tree(二叉搜索树,平衡二叉搜索树,AVL tree,红黑树)
    set
    map
    multiset
    multimap
    hashtable
    hash_set
    hash_map
    hash_multiset
    hash_multimap

二 序列容器用法

注意:优先复习常用的STL模板类容器,其他的后续补充。

2.1 vector

  • 内存分配
    vector和array的区别,体现在内存分配上。
    array:静态空间,线性连续内存 ,一旦分配内存大小就不能改变。(可以为堆内存,也可以时栈内存)。
    vector:动态空间,线性连续内存,内部机制允许自行扩充空间,不够存储时会自动扩容。
  • 遍历
cpp 复制代码
std::vector<int> vtData(2, 9);
std::vector::iterator it;
for (it = vtData.begin(); it != vtData.end(); it++) {
  std::cout << it << std::endl;
}
for (int i = 0; i < (int)vtData.size(); i++) {
  std::cout << vtData[i] << std::endl;
}
for (auto &item : vtData) {
  std::cout << item << std::endl;
}
  • 源码关键函数
    标准库copy函数
cpp 复制代码
// c++ 标准函数copy用法
// 从源范围复制元素到目标范围,而不考虑目标范围是否已有内容
#include <algorithm>  
#include <iterator>  
#include <vector>  
int main() {  
    std::vector<int> source = {1, 2, 3, 4, 5};  
    std::vector<int> destination(source.size()); // 确保目标容器有足够的空间  
    // 拷贝src [begin(), end())的元素到dst
    std::copy(source.begin(), source.end(), destination.begin());  
    // 现在 destination 包含 {1, 2, 3, 4, 5}  
    return 0;  
}

vector类型别名

cpp 复制代码
// vector中类型别名
class vector {
public:
  typedef T value_type;
  typedef value_type* pointer;
  typedef value_type* iterator;
  typedef value_type& reference;
  iterator start;  // 空间头;指向第一个元素;begin()
  iterator finish; // 空间尾;指向最后一个元素的下一个位置; end() 
public:
  iterator begin() {return start;}
  iterator end() {return finish;}
};

vector的第一个元素和最后一个

cpp 复制代码
// 第一元素
reference front {return *begin(); }
// 最后一个元素
reference back() {return *(end() - 1);}

vector尾端插入和取出,插入要考虑vector的动态空间特性,会自动扩容

cpp 复制代码
// 尾巴插入一个元素; 这里体现了vector的动态空间,自动扩容特性;
void push_back(const T& x)
{
  if (finish != end_of_storage) {
    construct(finish, x);
    ++finish;
  }
  else
    insert_aux(end(), x);
}
cpp 复制代码
// 将尾端元素取出
void pop_back() {
  --finish;
  destroy(finish);
}

erase清除指定位置的元素,这里体现了内存偏移

cpp 复制代码
iterator erase(iterator position) {
  // 不是最后一个元素,擦除此位置,后续元素往前移动
  if (position +1 != end()) {
    copy(position + 1, finish, position); 
  }
  // 有效元素的位置,减去1。处理尾部边界。
  -- finish;
  // 销毁最后一个元素(注意:finish在上一行代码,已经减1,进行了偏移)
  destroy(finish);
  // 注意:返回的还是原来迭代器的位置,但是此位置的元素已经变了。
  // 同时,要注意vector是线性内存,map是链表结构,需要考虑迭代器是否失效。
  return position;
}

考虑篇幅过长,使用连载方式,学习STL容器,请关注STL专题,点点赞!

相关推荐
cookies_s_s25 分钟前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭1 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
曼巴UE52 小时前
UE5.3 C++ TArray系列(一)
开发语言·c++·ue5
阿巴~阿巴~3 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
CoderCodingNo3 小时前
【GESP】C++二级真题 luogu-b3924, [GESP202312 二级] 小杨的H字矩阵
java·c++·矩阵
刃神太酷啦4 小时前
堆和priority_queue
数据结构·c++·蓝桥杯c++组
Heris994 小时前
2.22 c++练习【operator运算符重载、封装消息队列、封装信号灯集】
开发语言·c++
----云烟----4 小时前
C/C++ 中 volatile 关键字详解
c语言·开发语言·c++
ChoSeitaku6 小时前
12.重复内容去重|添加日志|部署服务到Linux上(C++)
linux·c++·windows
挣扎与觉醒中的技术人6 小时前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全