容器常見知識點一(順序容器)
順序容器
容器內元素的約束
- 容器元素類型必須支持賦值運算
- 元素類型的對象必須可以複製
- 如果容器存儲類類型的對象,那麼只有當其元素類型提供默認構造函數時,容器才能使用這種構造函數。
容器常用操作
- 迭代器,list容器既不支持算術運算,也不支持關係運算
- 在順序容器中添加元素:push_front(t) 只適用於list和deque
- insert(iter,t) 返回指向新添加元素的迭代器
- 在vector容器中添加元素可能會導致整個容器重新加載,這樣的話,該容器涉及的所有迭代器都會失效。當循環將元素插入到vecotr或deque容器中時,程序必須確保迭代器每次循環後都得到更新。
- 避免存儲end操作返回的迭代器,在容器的任何位置插入任何元素都會使該迭代器失效。
- 在vector或deque容器上做resize操作,有可能會使其所有的迭代器都失效。
- c[n],c.at(n)只適用於vector和deque
- pop_front和pop_back函數的返回值並不是刪除的元素值,而是void,要獲得刪除的元素值,必須在刪除元素之前調用,front或back
- erase、pop_front(只適用於list和deque)和pop_back,對於vector容器,指向刪除點後的元素的迭代器通常會失效。而對於deque容器,如果刪除時不包含第一個元素或最後一個元素,那麼該deque容器相關的所有迭代器都會失效。
- 與賦值相關的操作符都作用於整個容器。 除swap外,其他都可以用erase和insert完成。swap操作不會使迭代器失效。
- swap操作可以節省刪除元素的成本
- 如果在不同(或相同)類型的容器內,元素內省不相同,但互相兼容,則其賦值運算必須使用assign函數。例如:可以通過assign操作實現vector容器中一段char*類型的元素賦值給string類型的list容器
- 容器選用,對於大部分應用,使用vector容器是最好的。除非有充分的理由使用其他容器。
String
- string提供與vector容器相同的操作,除了他不支持棧方式操作容器,在string類型中不能使用front,back和pop_back.
- 只適用於string類型的操作
- substr函數,返回當前string對象的子串
- append和replace函數,用於修改string對象
- 一系列find函數,用於查找string對象
容器適配器
-
默認的stack和queue都是基於deque容器實現,而priority_queue則在vector容器上實現。在創建適配器時,通過將順序容器指定爲適配器的第二個類型實參,可以覆蓋其關聯的基礎容器類型。
stack<stirng, vetor<string> > strStk;