zoukankan      html  css  js  c++  java
  • C/C++基础----顺序容器

    通常没有特别的原因,用vector。

    list和forward_list有额外的内存开销,如果有很多小元素,不要使用。

    如果只在读取输入时需要在容器中间位置插入元素,随后需要随机访问。

      1确定是否真正需要在中间位置插入,可以用vector再用sort排序;

      2如必须在中间插入元素,可在输入阶段用list,完了之后拷贝到vector

    insert与emplace(emplace_back、emplace_front)

    emplace是直接将参数传递给元素类型的构造函数,在容器管理的内存空间中直接构造元素。

    与insert相比,省去了构造临时对象,减少了内存开销。

    类型别名在泛型编程中很有用。

    直接容器拷贝,要求容器类型和元素类型都匹配;

    用迭代器拷贝不要求,只要元素类型可以转换即可。

    array,跟内置数组一样,大小也是类型的一部分。

    跟其他容器不同,默认构造的array的元素都是默认初始化,跟数组一样。

    但是array支持拷贝和赋值操作,不过容器类型和大小,元素类型都必须相同。

    不允许将花括号列表赋值给array。

    assign允许从一个不同但相容的类型赋值

    assign操作不适用与array和关联容器。

    swap操作不会对任何元素进行拷贝删除或插入(除array外),可以在常数时间内完成。

    除string外指向容器的迭代器,指针和引用在swap之后都不会失效。仍指向swap操作之前的元素,但是已属于不同容器了。

    对于array,swap会真正交换元素,所需时间与元素数目成正比。但是迭代器指针等也不会失效。

    非成员版本swap在泛型编程中很重要。

    只有当元素也定义了相应的比较运算符的时候,才可以使用比较运算符来比较两个容器。

    向vector、string、deque插入元素(除首尾),都需要移动元素,甚至可能引起对象存储空间的重新分配。用迭代器范围插入时,迭代器不能指向本容器。

    访问元素

    在调用front或者back(解引用begin --end)之前,确保非空。

    c.front() c.baock() c[n] 都有越界风险 c.at(n)则会抛出out_of_range异常。

    forward_list特殊操作

    因为单向链表没有简单的办法来获取其前驱,所以是通过操作给定元素后面的元素来完成的。insert_after、emplace_after、erase_after。

    还特意定义了首前迭代器lst.before_begin()  lst.cbefore_begin()

    一般insert/emplace返回第一个添加的元素的迭代器,而after版本指向最后一个插入元素的迭代器。

    迭代器失效

    添加元素

    vector、string:存储空间重新分配,则全部失效;未重新分配,则插入之前部分的迭代器、引用指针仍有效。

    deque:首尾以外的位置,全部失效。首尾添加,迭代器会失效,引用指针不会。

    list、forward:仍有效。

    删除元素

    list、forward:仍有效。

    deque:首尾以外的位置,全部失效。删除尾元素,尾后迭代器失效;删除首元素,仍有效

    vector、string:被删之前的部分仍有效。

    当使用迭代器(指针、引用),最小化要求迭代器必须有效的程序片段。在循环中更新迭代器。

    尾后迭代器总是会失效,不要保存

    容量大小

    shrink_to_fit()  将分配的空间减小到与size()相同大小,仅适用于vector、string、deque

    capacity()   不重新分配内存,可以保存多少元素,仅vector和string

    reserve()   分配至少能容纳n个元素的内存空间,仅vector和string

    resize()是改变容器中元素的数目,不会减少容器预留的内存空间

     

    string额外操作

    构造

    如果从一个数组构造string,必须以空字符结尾,否则需要指定拷贝前n个字符。

    string s(cp, n);;

    string s(s1, pos,len),pos超出s1的size会报异常,len不管多大最多拷贝至string结尾。

    string除了迭代器版本,还支持下标的操作

    insert、erase、append、replace、assign

    搜索函数

    返回string::size_type无符号类型

    将返回值用int来保存不是个好主意。

    find(args)                          //查找s中args第一次出现的位置

    rfind(args)倒查                  //查找s中args最后一次出现的位置

    find_first_of(args)       //s中查找args任意一个字符第一次出现的位置

    find_last_of(args)        //s中查找args任意一个字符最后一次出现的位置

    find_first_not_of(args)    //s中查找第一个不在args中的字符

    find_last_not_of(args)     //s中查找最后一个不在args中的字符

    args中可以指定开始查找的位置pos,默认为0。这个可以方便连续查找。

    数值类型转换

    to_string(val)

    stoi(s, p, b)

    stol(s, p, b)

    stoul(s, p, b)

    stoll(s, p, b)

    stoull(s, p, b)

    stof(s, p, b)

    stod(s, p, b)

    stold(s, p, b)

    p是size_t的指针,用来存放第一个非数值字符的下标,默认为0

    b是转换的基数,默认为10

    容器适配器

    适配器是一种机制,能使某种事物的行为看起来像另外一种事物。容器、迭代器、函数都有适配器。通用操作empty、size、swap

    默认情况下,stack和queue是基于deque,priority_queue是基于vector实现。

    stack:只要求push_back pop_back back,除了array和forward_list都可以

    queue: 要求back、push_back、front、pop_front,可以构造与list或deque之上

    priority_queue:除了front、push_back、pop_back的操作还要求随机访问,可以构造于vector或deque。

    stack栈操作

    s.pop()

    s.push(item)

    s.emplace(args)

    s.top()

    queue和priority_queue操作

    q.pop()  返回queue首元素或者prio的最高优先级元素

    q.front() q.back()  返回首元素或者尾元素,不删除,只适用于queue

    q.top()   返回最高优先级元素,但不删除

    q.push(item)   在queue末尾或者prio中恰当位置创建一个元素或者由args构造一个元素

    q.emplace(args)

    前缀中缀后缀表达式

    http://blog.csdn.net/yuyanggo/article/details/48063473

  • 相关阅读:
    每日英语:China's Wistful Wen Gets His Wish
    每日英语:Singles Day in China
    每日英语:A Chinese Soccer Club Has Won Something!
    每日英语:Are Smartphones Turning Us Into Bad Samaritans?
    每日英语:The Benefits of a Sleep Buddy
    每日英语:Pediatricians Set Limits on Screen Time
    每日英语:The Risks of Big Data for Companies
    每日英语:Patent Wars Erupt Again in Tech Sector
    每日英语:Got a Case of the Mondays? Blame the Sunday Blues
    从构建分布式秒杀系统聊聊Lock锁使用中的坑
  • 原文地址:https://www.cnblogs.com/logchen/p/9576364.html
Copyright © 2011-2022 走看看