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