您的位置:首页 > 编程语言 > C语言/C++

C++ deques

2016-04-27 22:43 417 查看
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素
ms-help://MS.MSDNQTR.v90.chs/dv_vcstdlib/html/64842ee5-057a-4063-8c16-4267a0332584.htm
Constructors 构造函数
assign() 元素赋值
at() 返回指定位置的元素
back() 返回最末一个元素
begin() 返回第一个元素的迭代器
capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
clear() 清空所有元素
empty() 判断是否为空(返回true时为空)
end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
erase() 删除指定元素
front() 返回第一个元素
get_allocator() 返回的内存分配器
insert() 插入元素到中
max_size() 返回所能容纳元素的最大数量(上限)
pop_back() 移除最后一个元素
push_back() 在最后添加一个元素
push_front()将一个元素添加到双端队列的开头
rbegin() 返回尾部的逆迭代器
rend() 返回起始的逆迭代器
reserve() 设置最小的元素容纳数量
resize() 改变元素数量的大小
size() 返回元素数量的大小
swap() 交换


#include <deque>
#include <iostream>

//构造函数
void DequeConstructor(void);

//元素赋值
void Deque_assign(void);

//返回指定位置的元素
void Deque_at(void);

//返回最末一个元素
void Deque_back(void);

//返回第一个元素的迭代器
void Deque_begin(void);

//清空所有元素
void Deque_clear(void);

//判断是否为空(返回true时为空)
void Deque_empty(void);

//返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
void Deque_end(void);

//删除指定元素
void Deque_erase(void);

//返回第一个元素
void Deque_front(void);

//返回内存分配器
void Deque_get_allocator(void);

//插入元素到
void Deque_insert(void);

//返回所能容纳元素的最大数量(上限)
void Deque_max_size(void);

//移除最后一个元素
void Deque_pop_back(void);

//在最后添加一个元素
void Deque_push_back(void);

//将一个元素添加到双端队列的开头
void Deque_push_front(void);

//返回尾部的逆迭代器
void Deque_rbegin(void);

//返回起始的逆迭代器
void Deque_rend(void);

//改变元素数量的大小
void Deque_resize(void);

//返回元素数量的大小
void Deque_size(void);

//交换
void Deque_swap(void);

int main()
{
//DequeConstructor();
//Deque_assign();
//Deque_at();
//Deque_back();
//Deque_begin();
//Deque_clear();
//Deque_empty();
//Deque_end();
//Deque_erase();
//Deque_front();
//Deque_get_allocator();
//Deque_insert();
//Deque_max_size();
//Deque_pop_back();
//Deque_push_back();
//Deque_push_front();
//Deque_rbegin();
//Deque_rend();
//Deque_resize();
//Deque_size();
Deque_swap();
return 0;
}

//构造函数
void DequeConstructor(void)
{
using namespace std;
deque <int>::iterator c1_Iter, c2_Iter, c3_Iter, c4_Iter, c5_Iter, c6_Iter;

// Create an empty deque c0
deque <int> c0;

// Create a deque c1 with 3 elements of default value 0
deque <int> c1(3);

// Create a deque c2 with 5 elements of value 2
deque <int> c2(5, 2);

// Create a deque c3 with 3 elements of value 1 and with the
// allocator of deque c2
deque <int> c3(3, 1, c2.get_allocator());

// Create a copy, deque c4, of deque c2
deque <int> c4(c2);

// Create a deque c5 by copying the range c4[_First, _Last)
c4_Iter = c4.begin();
c4_Iter++;
c4_Iter++;
deque <int> c5(c4.begin(), c4_Iter);

// Create a deque c6 by copying the range c4[_First, _Last) and
// c2 with the allocator of deque
c4_Iter = c4.begin();
c4_Iter++;
c4_Iter++;
c4_Iter++;
deque <int> c6(c4.begin(), c4_Iter, c2.get_allocator());

cout << "c1 = ";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << *c1_Iter << " ";
cout << endl;

cout << "c2 = ";
for (c2_Iter = c2.begin(); c2_Iter != c2.end(); c2_Iter++)
cout << *c2_Iter << " ";
cout << endl;

cout << "c3 = ";
for (c3_Iter = c3.begin(); c3_Iter != c3.end(); c3_Iter++)
cout << *c3_Iter << " ";
cout << endl;

cout << "c4 = ";
for (c4_Iter = c4.begin(); c4_Iter != c4.end(); c4_Iter++)
cout << *c4_Iter << " ";
cout << endl;

cout << "c5 = ";
for (c5_Iter = c5.begin(); c5_Iter != c5.end(); c5_Iter++)
cout << *c5_Iter << " ";
cout << endl;

cout << "c6 = ";
for (c6_Iter = c6.begin(); c6_Iter != c6.end(); c6_Iter++)
cout << *c6_Iter << " ";
cout << endl;
return;
/*
c1 = 0 0 0
c2 = 2 2 2 2 2
c3 = 1 1 1
c4 = 2 2 2 2 2
c5 = 2 2
c6 = 2 2 2
请按任意键继续. . .
*/
}

//元素赋值
void Deque_assign(void)
{
using namespace std;
deque <int> c1, c2;
deque <int>::const_iterator cIter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);
c2.push_back(40);
c2.push_back(50);
c2.push_back(60);

cout << "c1 =";
for (cIter = c1.begin(); cIter != c1.end(); cIter++)
cout << " " << *cIter;
cout << endl;

c1.assign(++c2.begin(), c2.end());
cout << "c1 =";
for (cIter = c1.begin(); cIter != c1.end(); cIter++)
cout << " " << *cIter;
cout << endl;

c1.assign(7, 4);
cout << "c1 =";
for (cIter = c1.begin(); cIter != c1.end(); cIter++)
cout << " " << *cIter;
cout << endl;

return;
/*
c1 = 10 20 30
c1 = 50 60
c1 = 4 4 4 4 4 4 4
请按任意键继续. . .
*/
}

//返回指定位置的元素
void Deque_at(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
c1.push_back(20);

const int& i = c1.at(0);
int& j = c1.at(1);
cout << "The first element is " << i << endl;
cout << "The second element is " << j << endl;

return;
/*
The first element is 10
The second element is 20
请按任意键继续. . .
*/
}

//返回最末一个元素
void Deque_back(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
c1.push_back(11);

int& i = c1.back();
const int& ii = c1.front();

cout << "The last integer of c1 is " << i << endl;
i--;
cout << "The next-to-last integer of c1 is " << ii << endl;

return;
/*
The last integer of c1 is 11
The next-to-last integer of c1 is 10
请按任意键继续. . .
*/
}

//返回第一个元素的迭代器
void Deque_begin(void)
{
using namespace std;
deque <int> c1;
deque <int>::iterator c1_Iter;
deque <int>::const_iterator c1_cIter;

c1.push_back(1);
c1.push_back(2);

c1_Iter = c1.begin();
cout << "The first element of c1 is " << *c1_Iter << endl;

*c1_Iter = 20;
c1_Iter = c1.begin();
cout << "The first element of c1 is now " << *c1_Iter << endl;

// The following line would be an error because iterator is const
// *c1_cIter = 200;

return;
/*
The first element of c1 is 1
The first element of c1 is now 20
请按任意键继续. . .
*/
}

//清空所有元素
void Deque_clear(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);

cout << "The size of the deque is initially " << c1.size() << endl;
c1.clear();
cout << "The size of the deque after clearing is " << c1.size() << endl;

return;
/*
The size of the deque is initially 3
The size of the deque after clearing is 0
请按任意键继续. . .
*/
}

//判断是否为空(返回true时为空)
void Deque_empty(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
if (c1.empty())
cout << "The deque is empty." << endl;
else
cout << "The deque is not empty." << endl;

return;
/*
The deque is not empty.
请按任意键继续. . .
*/
}

//返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
void Deque_end(void)
{
using namespace std;
deque <int> c1;
deque <int>::iterator c1_Iter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);

c1_Iter = c1.end();
c1_Iter--;
cout << "The last integer of c1 is " << *c1_Iter << endl;

c1_Iter--;
*c1_Iter = 400;
cout << "The new next-to-last integer of c1 is " << *c1_Iter << endl;

// If a const iterator had been declared instead with the line:
// deque <int>::const_iterator c1_Iter;
// an error would have resulted when inserting the 400

cout << "The deque is now:";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << " " << *c1_Iter;

cout << endl;
return;
/*
The last integer of c1 is 30
The new next-to-last integer of c1 is 400
The deque is now: 10 400 30
请按任意键继续. . .
*/
}

//删除指定元素
void Deque_erase(void)
{
using namespace std;
deque <int> c1;
deque <int>::iterator Iter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);
c1.push_back(40);
c1.push_back(50);
cout << "The initial deque is: ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << endl;
c1.erase(c1.begin());
cout << "After erasing the first element, the deque becomes: ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << endl;
Iter = c1.begin();
Iter++;
c1.erase(Iter, c1.end());
cout << "After erasing all elements but the first, deque becomes: ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << endl;

return;
/*
The initial deque is: 10 20 30 40 50
After erasing the first element, the deque becomes: 20 30 40 50
After erasing all elements but the first, deque becomes: 20
请按任意键继续. . .
*/
}

//返回第一个元素
void Deque_front(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
c1.push_back(11);

int& i = c1.front();
const int& ii = c1.front();

cout << "The first integer of c1 is " << i << endl;
i++;
cout << "The second integer of c1 is " << ii << endl;
return;
/*
The first integer of c1 is 10
The second integer of c1 is 11
请按任意键继续. . .
*/
}

//返回内存分配器
void Deque_get_allocator(void)
{

using namespace std;
// The following lines declare objects that use the default allocator.
deque <int> c1;
deque <int, allocator<int> > c2 = deque <int, allocator<int> >(allocator<int>());

// c3 will use the same allocator class as c1
deque <int> c3(c1.get_allocator());

deque <int>::allocator_type xlst = c1.get_allocator();
// You can now call functions on the allocator class used by c1

return;
}

//插入元素到
void Deque_insert(void)
{
using namespace std;
deque <int> c1, c2;
deque <int>::iterator Iter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);
c2.push_back(40);
c2.push_back(50);
c2.push_back(60);

cout << "[ c1 = ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << "]" << endl;

Iter = c1.begin();
Iter++;
c1.insert(Iter, 100);
cout << "[ c1 = ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << "]" << endl;

Iter = c1.begin();
Iter++;
Iter++;
c1.insert(Iter, 2, 200);

cout << "[ c1 = ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << "]" << endl;

c1.insert(++c1.begin(), c2.begin(), --c2.end());

cout << "[ c1 = ";
for (Iter = c1.begin(); Iter != c1.end(); Iter++)
cout << *Iter << " ";
cout << "]" << endl;

return;
/*
[ c1 = 10 20 30 ]
[ c1 = 10 100 20 30 ]
[ c1 = 10 100 200 200 20 30 ]
[ c1 = 10 40 50 100 200 200 20 30 ]
请按任意键继续. . .
*/
}

//返回所能容纳元素的最大数量(上限)
void Deque_max_size(void)
{
using namespace std;
deque <int> c1;
deque <int>::size_type i;

i = c1.max_size();
cout << "The maximum possible length of the deque is " << i << "." << endl;

return;
/*
The maximum possible length of the deque is 1073741823.
请按任意键继续. . .
*/
}

//移除最后一个元素
void Deque_pop_back(void)
{
using namespace std;
deque <int> c1;

c1.push_back(1);
c1.push_back(2);
cout << "The first element is: " << c1.front() << endl;
cout << "The last element is: " << c1.back() << endl;

c1.pop_back();
cout << "After deleting the element at the end of the deque, the "
"last element is: " << c1.back() << endl;

return;
/*
The first element is: 1
The last element is: 2
After deleting the element at the end of the deque, the last element is: 1
请按任意键继续. . .
*/
}

//在最后添加一个元素
void Deque_push_back(void)
{
using namespace std;
deque <int> c1;

c1.push_back(1);
if (c1.size() != 0)
cout << "Last element: " << c1.back() << endl;

c1.push_back(2);
if (c1.size() != 0)
cout << "New last element: " << c1.back() << endl;

return;
/*
Last element: 1
New last element: 2
请按任意键继续. . .
*/
}

//将一个元素添加到双端队列的开头
void Deque_push_front(void)
{
using namespace std;
deque <int> c1;

c1.push_front(1);
if (c1.size() != 0)
cout << "First element: " << c1.front() << endl;

c1.push_front(2);
if (c1.size() != 0)
cout << "New first element: " << c1.front() << endl;

return;
/*
First element: 1
New first element: 2
请按任意键继续. . .
*/
}

//返回尾部的逆迭代器
void Deque_rbegin(void)
{

using namespace std;
deque <int> c1;
deque <int>::iterator c1_Iter;
deque <int>::reverse_iterator c1_rIter;

// If the following line had replaced the line above, an error
// would have resulted in the line modifying an element
// (commented below) because the iterator would have been const
// deque <int>::const_reverse_iterator c1_rIter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);

c1_rIter = c1.rbegin();
cout << "Last element in the deque is " << *c1_rIter << "." << endl;

cout << "The deque contains the elements: ";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << *c1_Iter << " ";
cout << "in that order.";
cout << endl;

// rbegin can be used to iterate through a deque in reverse order
cout << "The reversed deque is: ";
for (c1_rIter = c1.rbegin(); c1_rIter != c1.rend(); c1_rIter++)
cout << *c1_rIter << " ";
cout << endl;

c1_rIter = c1.rbegin();
*c1_rIter = 40; // This would have caused an error if a
// const_reverse iterator had been declared as
// noted above
cout << "Last element in deque is now " << *c1_rIter << "." << endl;

return;
/*
Last element in the deque is 30.
The deque contains the elements: 10 20 30 in that order.
The reversed deque is: 30 20 10
Last element in deque is now 40.
请按任意键继续. . .
*/
}

//返回起始的逆迭代器
void Deque_rend(void)
{
using namespace std;

deque <int> c1;
deque <int>::iterator c1_Iter;
deque <int>::reverse_iterator c1_rIter;
// If the following line had replaced the line above, an error
// would have resulted in the line modifying an element
// (commented below) because the iterator would have been const
// deque <int>::const_reverse_iterator c1_rIter;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);

c1_rIter = c1.rend();
c1_rIter--; // Decrementing a reverse iterator moves it forward
// in the deque (to point to the first element here)
cout << "The first element in the deque is: " << *c1_rIter << endl;

cout << "The deque is: ";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << *c1_Iter << " ";
cout << endl;

// rend can be used to test if an iteration is through all of
// the elements of a reversed deque
cout << "The reversed deque is: ";
for (c1_rIter = c1.rbegin(); c1_rIter != c1.rend(); c1_rIter++)
cout << *c1_rIter << " ";
cout << endl;

c1_rIter = c1.rend();
c1_rIter--; // Decrementing the reverse iterator moves it backward
// in the reversed deque (to the last element here)
*c1_rIter = 40; // This modification of the last element would
// have caused an error if a const_reverse
// iterator had been declared (as noted above)
cout << "The modified reversed deque is: ";
for (c1_rIter = c1.rbegin(); c1_rIter != c1.rend(); c1_rIter++)
cout << *c1_rIter << " ";
cout << endl;

return;
/*
The first element in the deque is: 10
The deque is: 10 20 30
The reversed deque is: 30 20 10
The modified reversed deque is: 30 20 40
请按任意键继续. . .
*/
}

//改变元素数量的大小
void Deque_resize(void)
{
using namespace std;
deque <int> c1;

c1.push_back(10);
c1.push_back(20);
c1.push_back(30);

c1.resize(4, 40);
cout << "The size of c1 is: " << c1.size() << endl;
cout << "The value of the last element is " << c1.back() << endl;

c1.resize(5);
cout << "The size of c1 is now: " << c1.size() << endl;
cout << "The value of the last element is now " << c1.back() << endl;

c1.resize(2);
cout << "The reduced size of c1 is: " << c1.size() << endl;
cout << "The value of the last element is now " << c1.back() << endl;

return;
/*
The size of c1 is: 4
The value of the last element is 40
The size of c1 is now: 5
The value of the last element is now 0
The reduced size of c1 is: 2
The value of the last element is now 20
请按任意键继续. . .
*/
}

//返回元素数量的大小
void Deque_size(void)
{
using namespace std;
deque <int> c1;
deque <int>::size_type i;

c1.push_back(1);
i = c1.size();
cout << "The deque length is " << i << "." << endl;

c1.push_back(2);
i = c1.size();
cout << "The deque length is now " << i << "." << endl;
return;
/*
The deque length is 1.
The deque length is now 2.
请按任意键继续. . .
*/
}

//交换
void Deque_swap(void)
{

using namespace std;
deque <int> c1, c2, c3;
deque <int>::iterator c1_Iter;

c1.push_back(1);
c1.push_back(2);
c1.push_back(3);
c2.push_back(10);
c2.push_back(20);
c3.push_back(100);

cout << "The original deque c1 is:";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << " " << *c1_Iter;
cout << endl;

c1.swap(c2);

cout << "After swapping with c2, deque c1 is:";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << " " << *c1_Iter;
cout << endl;

swap(c1, c3);

cout << "After swapping with c3, deque c1 is:";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << " " << *c1_Iter;
cout << endl;

swap<>(c1, c2);
cout << "After swapping with c2, deque c1 is:";
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); c1_Iter++)
cout << " " << *c1_Iter;
cout << endl;

return;
/*
The original deque c1 is: 1 2 3
After swapping with c2, deque c1 is: 10 20
After swapping with c3, deque c1 is: 100
After swapping with c2, deque c1 is: 1 2 3
请按任意键继续. . .
*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: