1.deque容器介紹
deque 是 double-ended queue 的縮寫,又稱雙端隊列容器。deque容器支持從頭部和尾部雙端插入、刪除數據。與vector容器不同的是,vector容器是一段連續的空間,而deque沒有所謂容量的概念,因為它是動態的以分段連續空間組合而成,隨時可以增加一段新的空間并連接起來。不會像vector那樣,因為空間不足而擴容,復制元素到新的空間,再釋放舊的空間。因此deque沒有必要提供所謂的擴容(reserve)的功能。
deque容器可以看做是一個雙端數組,可以從頭或者尾之間插入數據。從頭插入或者刪除使用push_front和pop_front。從尾插入或刪除輸出使用push_backh和pop_back。從任意位置插入可以使用insert函數。
deque容器,在空間管理上是通過內部中控器來實現的。中控器記錄每一個緩沖區的地址。緩沖區中存放真實的數據內容。因而在deque容器中,數據空間是由多段空間組成的。
deque容器是沒有預留空間函數reserve和獲取容量大小函數capacity。
deque從頭端插入數據比vector容器快,而且數據量越大越明顯。
2.deque容器構造函數
deque容器的構造函數和vector類似,由無參構造、有參構造、拷貝構造。
deque構造函數:
deque() --無參構造
deque(begin,end);//有參構造,將begin~end之間的數據拷貝
deque(int count,elem);//count個elem數據
deque(deque &p);//拷貝構造
應用示例:
#include
using namespace std;
#include
#include
void PrintDeque(const deque& p)
{
for (deque::const_iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < *deq < " ";
}
cout < endl;
}
void Print(int val)
{
cout < val < " ";
}
void test()
{
//創建一個deque容器
deque deq;
//插入數據:尾插
deq.push_back(1);
deq.push_back(2);
deq.push_back(3);
//插入數據:頭插
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < "第一個數據:" < deq.front() < endl;
cout < "最后一個數據:" < deq.back() < endl;
cout < "遍歷:" < endl;
PrintDeque(deq);
cout < "for_each逆向遍歷:" < endl;
for_each(deq.rbegin(), deq.rend(), Print);
cout < endl;
cout < "有參構造:" < endl;
deque deq2(deq.rbegin(), deq.rend());//區間賦值
PrintDeque(deq2);
deque deq3(3, 666);//賦值3個666
PrintDeque(deq3);
cout < "拷貝構造:"< endl;
deque deq4(deq);//拷貝構造
PrintDeque(deq4);
}
int main()
{
test();
system("pause");
}
3.deque容器賦值
賦值方式可以直接使用“=”賦值,也可以通過函數assign實現。
deq賦值:
重載"=":operator=();
assign(begin,end);//區間賦值
assign(int count,elem);//count個elem
使用示例:
include
#include
using namespace std;
void PrintDeque(const deque& p)
{
for (deque::const_iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < *deq < " ";
}
cout < endl;
}
void test()
{
deque deq;
//尾插
deq.push_back(1);
deq.push_back(2);
deq.push_back(3);
//頭插
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < "deq 直接插入" < endl;
PrintDeque(deq);
deque deq2 = deq;//之間賦值
cout < "deq2 =賦值" < endl;
PrintDeque(deq2);
cout < "deq3 區間賦值" < endl;
deque deq3;
deq3.assign(deq.begin(), deq.end());
PrintDeque(deq3);
}
int main()
{
test();
system("pause");
}
4.deque設置和獲取元素個數
判斷容器是否為空可以使用empty()函數,設置元素個數可以使用resize()函數,獲取元素個數使用size()函數。
deque容器獲取大小:
判斷容器是否為空:empty() ---為空返回true
獲取容器元素個數:size()
指定容器大小:resize(int num);
resize(int num,elem);//指定大小,超出部分用elem填充
resize指定大小,若小于則會將超出部分刪除
注意:
deque容器沒有獲取容量函數capacity()
使用示例:
#include
using namespace std;
#include
void PrintDeque(deque& p)
{
for (deque::iterator deq = p.begin(); deq != p.end(); deq++)
{
cout < *deq < " ";
}
cout < endl;
}
void test()
{
deque deq;
deq.push_back("hello");
deq.push_back("學習");
deq.push_back("c++");
deq.push_back("deque容器");
deq.push_back("使用");
deq.push_back("示例");
PrintDeque(deq);
cout < "元素個數:" < deq.size() < endl;
deq.resize(10,"c++");//指定個數,剩余填充"c++";
PrintDeque(deq);
deq.resize(3);
PrintDeque(deq);
cout < "元素個數:" < deq.size() < endl;
}
int main()
{
test();
system("pause");
}
5.deque元素的插入與刪除
deque容器是雙端性質的,所以可以從頭端或者尾端插入數據。相關函數如下:
deque容器插入與刪除:
push_back、pop_back --尾插和尾刪
push_front、pop_front --頭插和頭刪除
insert(pos,elem); --pos是一個迭代器,在pos位置插入elem,返回新數據位置
insert(pos,n,elem); ---在pos位置插入n個elem,無返回值
insert(pos,begin,end); --在pos位置插入begin~endl的數據,無返回值
clear() --清空整個deque容器
erase(begin,end); --刪除begin~end之間的數,返回下一個數據位置
erase(pos) --刪除指定位置的數
使用示例:
#include
using namespace std;
#include
void PrintDeque(deque& deq)
{
for (deque::iterator p = deq.begin(); p != deq.end(); p++)
{
cout < *p < " ";
}
cout < endl;
}
void test()
{
deque deq;
//頭插
deq.push_front(1);
deq.push_front(2);
deq.push_front(3);
//尾插
deq.push_back(4);
deq.push_back(5);
deq.push_back(6);
cout < "t插入數據示例:" < endl;;
PrintDeque(deq);
deq.pop_back();//尾刪
deq.pop_front();//頭刪
cout < "t刪除數據示例:" < endl;;
PrintDeque(deq);
cout < "tinsert插入數據示例:" < endl;
deq.insert(deq.begin() + 2, 666);//在起始的第二個位置插入666
deq.insert(deq.begin() + 5, 3, 888);//在起始的第5個位置插入三個888
PrintDeque(deq);
deque deq2;
cout < "tinsert區間插入數據示例:" < endl;
deq2.insert(deq2.begin(), deq.begin() + 5, deq.begin() + 8);//在deq2的起始位置插入deq的第5~8個位置的數
PrintDeque(deq2);
//刪除數據
cout < "指定位置刪除:" < endl;
deq.erase(deq.begin() + 2);//刪除第2個位置的數
PrintDeque(deq);
cout < "指定區間刪除:" < endl;
deq.erase(deq.begin() + 3, deq.begin() + 6);//刪除第3~6位置上的數
PrintDeque(deq);
cout < "清空:" < endl;
deq2.clear();
PrintDeque(deq2);
}
int main()
{
test();
system("pause");
}
6.deque容器數據存取
deque可以通過[]讀寫數據,也可以通過函數at()來實現。
deque容器數據存取:
重載[]:operator[]()
at(pos);
獲取第一個成員:front
獲取最后一個成員:back
第一個成員的前一個位置:rend
最后一個成員的下一個位置:end
使用示例:
#include
using namespace std;
#include
#include
void test()
{
deque deq;
deq.push_back("hello");
deq.push_back("c++");
deq.push_back("學習");
deq.push_back("示例");
cout < "最后一個成員:" < deq.back() < endl;
cout < "第一成員:" < deq.front() < endl;
cout<"遍歷:";>
7.排序
可以使用sort函數對成員進行排序。該函數的頭文件是algorithm。
排序:sort(iterator begin,iterator end);//默認是升序
使用示例:
#include
#include
#include
#include
using namespace std;
void test()
{
string str = "hello,world";
sort(str.begin(), str.end());
cout < str < endl;
deque deq;
deq.push_back(0);
deq.push_back(2);
deq.push_back(1);
deq.push_front(4);
deq.push_front(5);
deq.push_front(6);
cout < "原內容:" < endl;
for (int i = 0; i < deq.size(); i++)
{
cout < deq[i] < " ";
}
cout < endl;
cout < "排序后:" < endl;
sort(deq.begin(), deq.end());
for (int i = 0; i < deq.size(); i++)
{
cout < deq[i] < " ";
}
cout < endl;
cout < "數組排序:" < endl;
int buff[] = { 1,2,3,6,4,0,8,7,2 };
sort(buff, buff+ sizeof(buff) / sizeof(int));
for (int i = 0; i < sizeof(buff) / sizeof(int); i++)
{
cout < buff[i] < " ";
}
}
int main()
{
test();
system("pause");
}
審核編輯:湯梓紅
-
函數
+關注
關注
3文章
4327瀏覽量
62569 -
容器
+關注
關注
0文章
495瀏覽量
22060 -
C++
+關注
關注
22文章
2108瀏覽量
73618
發布評論請先 登錄
相關推薦
評論