Primer 第八章 順序容器

2020-08-12 23:44:14

Sequential container

六種順序容器

  • 支援快速隨機存取
    • vector
      +
    • deque
    • string
    • array
  • 不支援快速隨機存取
    • list
    • forward_list
      容器選擇
  1. 無腦vector
  2. 要求中間插入或者刪除,list 或者 forward_list
  3. 複合型別,可以先用 list 或者 forward_list 做,再用 vector 存放
    容器操作
  • construction function
  • assignment & swap
    • assign(n,t)
      //assign +⑨overload
    • swap
      • 除array外,swap並不會真正交換元素,只會交換容器的內部數據結構
      • 兩種版本 成員與非成員
        • 優先非成員
  • size
    • c.size()
    • c.max_size()
    • c.empty()
  • add/delete element
    • c.insert()
    • c.emplace()
    • c.erasse()
    • c.clear()
  • get iterator
    • begin()/end()
    • cbegin()/cend() *(differ const iterator)
    • rbegin()/rend()
    • crbegin()/crend()
      對於迭代器,const_iterator 指向的物件爲常數,本身非常數;const iterator 本身爲常值,可以改動指向值

iterator range
called left-inclusive interval
[begin,end)
標準庫 array 的大小也是型別的一部分。定義一個 array ,除了指定元素型別,還要指定容器大小
array 支援拷貝初始化,但必須陣列型別匹配
array 不支援 assign, 也不能列表賦值
可以將const char* 轉換爲 string

順序容器操作
push_back() emplace_back()
push_front() emplace_front()
insert(iterator,t) emplace(iterator,args) 在迭代器指向的元素之前建立一個值爲t或由args建立的元素。返回指向新新增元素的迭代器
insert(p,n,t) 在迭代器指向的元素之前建立 n 個值爲 t 元素。返回指向新新增元素的迭代器
insert(p,b,e) 將迭代器 b 和 e 指定範圍中的元素插入到迭代器p所指之前。
insert(p,il) 將il列表中的元素值插入迭代器p指向的元素之前。返回新新增的第一個元素的迭代器;列表空則返回p
erase()
插入後返回插入的第一個的迭代器
刪除後返回刪除的後一個的迭代器
back() front() [n] atn返回參照

forward_list
before_begin()
insert_after()
erase_after()

change the size of the container
resize(n) resize(n,t)(the value of the new-added element is t)

container-size manage
shrink_to_fit() (使capacity()等於size())//only for vector string deque
capacity() (不重新分配記憶體空間的話,可以儲存多少元素)//only for vector string
reserve(n) (設定下次分配至少容納n個元素的記憶體空間)//only for vector string超出後恢復預設增長方式

參數 args詳見P323

構造 string 的其他方法
P321
append //後置新增
insert
assign //替換
replace(需要詳查)(前兩個參數確定範圍,後一個參數爲形參列表)

  • s.replace(range,args)

  • 返回指向 s 的參照
    substr

  • 返回一個 string

  • 可以傳遞一個可選的開始位置和計數值()

    • s.substr(pos,n) n的預設值爲s.size()-pos (複製從pos開始n個)
  • 整體查詢

    • find()
    • rfind()
  • 字元查詢

    • find_first_of()
    • find_last_of()
    • find_first_not_of()
    • find_last_not_of()
  • args

    • c(char),pos(預設爲0)
    • s,pos
    • cp(C style char*),pos
    • cp,pos(開始下標),n(下標開始後的個數)

adaptor

對接容器,統一操作

stack //based on deque
queue //based on deque
priority_queue //based on vector
所有適配器都要求容器具有新增、刪除以及存取尾元素的能力

stack

std::vector<int>vi;
std::stack<int>svi(vi);//將vi拷貝到svi
std::stack<int,std::vector<int>>empty_svi;//建立空棧
std::stack<int>si;//建立空棧

s.pop() 刪除棧頂元素,但不返回該元素值
s.push() 建立新元素壓入棧頂,該元素通過拷貝或移動item而來,或者由args構造
s.emplace(args)
s.top() 返回棧頂元素,但不將元素彈出棧

queue (first-in,first-out)FIFO

q.pop() 刪除queue首元素或者priority_queue的最高優先順序元素
q.front() 返回首元素,不刪除only for queue
q.back() 返回尾元素,不刪除only for queue
q.top() 返回最高優先順序元素,但不刪除該元素only for priority_queue
q.push()
q.emplace() 可以當q.push()用