C++ Primer(一)_标准库_顺序容器

目录

顺序容器

选择什么容器根据业务需求, 研读STL剖析了解底层数据结构, 更加清楚各种优势劣势

零碎点

  • 迭代器被设置为左闭右合带来的编程假设

    • begin == end,范围为空
    • begin != end, 至少一个元素
    • begin可递增至end
  • 两大类型的容器初始化——同类型容器拷贝,迭代器范围拷贝

    • 前者要求容器类型一致
    • 后者只要求元素可转换
  • 两大类型的容器赋值——=号赋值,assign赋值

    • 前者用于列表或同类型容器
    • 后者用于迭代器,初始化列表,(n,elem)方式;限制顺序容器
  • swap交换容器内容

    除Array,其他容器只是交换数据结构,不涉及元素拷贝插入删除,常数时间

    • 失效内容:除了string容器,其他的都不失效,但是已经转换了容器,而Array则是转换了值
  • 容器之比较——任何容器都支持== !=;除无序关联(unordered的关联容器)外,其他都支持< > <= ……各种比较

    容器的== !=由元素的==实现;其他由<实现;

    然而<也足以推断==情况(交换位置多比一次即可)

顺序容器的操作

失效操作请剖析STL

以下增删改查针对绝大多数顺序容器

  • 增——拷贝

    emplace区别主要是可用提供初始化器而非元素对象

    front_list有自己的insert和emplace,只支持下面的front型操作
    .push_back(t)
    .emplace_back(args) args是可用以来初始化元素的东西
    .push_front(t) vecotr和string不支持,费时
    .emplace_front(args) vecotr和string不支持
    .insert(p, t) 这个及以下的都返回插入元素的迭代器
    .emplace(p, args)
    .insert(p, n, t) n个t
    .insert(p, b, e) 迭代器范围
    .insert(p, il) il,初始化列表
  • 查(访问)——引用访问

空或越界除了at外,都未定义
.back()
.front()
[] 和at只能用于vec,str,deque,arr
.at() 下标越界,返回out_of_range
不检查合法性
.pop_back() f_l不支持
.pop_front() vec, str不支持
.erase(p) 迭代器
.erase(b, e) 范围
.clear() 清空
  • 改变大小
.resize(n)
.resize(n, t) 若为增大,新元素初始化为t
  • 容量操作——vector,string,deque
deque不支持后两个
.shrink_to_fit() capacity减小到size
.capacity()
.reserve(n) 小于等于当前什么都不做

强制释放或缩小vector内容

// 强制释放
vector<int> vec;
{
    vector<int>().swap(vec);
}

// 强制缩小
vector<int> vec;
swap(vector<int>(vec), vec);

迭代器失效情况 // TODO底层?

指针、迭代器、引用,失效指不再表示任何元素

    • vector和string,
      • 内存重分配——全部失效
      • 未重分配——插入位置后的全失效
    • deque
      • 非首尾——全部失效
      • 首尾——迭代器失效,其他有效
    • list和forward_list,全都有效
    • vector和string
      • 被删除点后全部失效
    • deque
      • 非首尾——全部失效
      • 首尾——首迭代器或尾迭代器失效
    • list和forward_list,除删除点全都有效

特立独行者——front_list

它是单向链表,获取前驱比较麻烦

.before_begin() 表头前不存在的元素,不可解引用
.insert_after(p, t) 返回最后一个插入的元素的迭代器
.insert_after(p, n, t)
.insert_after(p, b, e)
.insert_after(p, il)
.emplace_after(p, args)
.erase_after(p) 返回被删除元素的后一个元素的迭代器
.erase_after(b, e)

string的额外操作

  • 构造的其他方法
string s(cp, n) cp是字符数组指针
string s(str2, pos2) str2是已存在string
string s(s2, pos2, len2)
  • s.substr(pos, n) // 返回子串

  • 修改

.insert(pos, args) pos可以是下标,返回引用;可以是迭代器,返回迭代器
.erase(pos, len) len省略删完,返回引用
.assign(args) 返回引用
.append(args) 返回引用
.replace(range, args) range可以是pos,n(下标长度)或者b,e(迭代器),返回引用
  • 搜索
找到返回下标,没有就string::npos(一个string::size_type值,-1,但是因为无符号,所以是最大值)
.find(args) 第一次出现位置
.rfind(args) 最后一次出现位置
.find_first_of(args) args中任意字符第一次出现
.find_last_of(args)
.find_first_not_of(args) 第一个不再args中的字符
.find_last_not_of(args)
  • 比较.compare

    参数格式;返回值:0等于 >0大于 <0小于 n表示长度
    s2
    pos1, n1, s2
    pos1, n1, s2, pos2, n2
    cp
    pos1, n1, s2
    pos1, n1, cp, n2
  • 数制转换

to_string(val)
stoi(s, p, b) 后面都一样,s字符串,p是size_t指针,保存第一个非数字内容的下标
stol b是转换基数
stoul 整型不识别e
stoll
stoull
stof(s, p) 识别e
stod
stold

适配器操作

  • 通用操作
.empty()
.size()
.swap()
swap(a, b)
  • stack——默认基于deque,可用list或vector,用模板第二个参数修改
.pop() 删除而不返回
.push(item)
.emplace(args)
.top() 可修改
  • queue——基于deque,可list或vector
.front() 可修改
.back()
.pop()
.push(t)
.emplace(args)
  • priority_queue——基于vector,可deque
.pop()
.top() 不能修改
.push()
.emplace()

猜你喜欢

转载自www.cnblogs.com/YanceW/p/11695611.html