📜  deque c++ (1)

📅  最后修改于: 2023-12-03 15:30:26.364000             🧑  作者: Mango

deque C++介绍

Deque(双向队列)是一个数据结构,与vector相似,但不同在于deque中的元素可以从两端进行插入和删除操作。在C++ STL中,deque通过容器类deque实现,其中T是存储在deque的元素类型。

创建Deque

元素类型已知的deque对象可以通过以下方式进行创建:

#include <deque>

using namespace std;

deque<int> myDeque; // 创建一个空的整数型deque对象
deque<string> myOtherDeque; // 创建一个空的字符串型deque对象
双向插入

要在deque的特定位置插入一个或多个元素,可以使用以下函数:

iterator insert (const_iterator position, const value_type& val);
void insert (const_iterator position, size_type n, const value_type& val);
template <class InputIterator>
void insert (const_iterator position, InputIterator first, InputIterator last);
  • insert(const_iterator position, const value_type& val):在位置position之前插入值为val的元素。
  • insert(const_iterator position, size_type n, const value_type& val):在位置position之前插入n个值为val的元素。
  • insert(const_iterator position, InputIterator first, InputIterator last):在位置position之前插入[first, last)中的所有元素。

例如:

#include <iostream>
#include <deque>

using namespace std;

int main () {
  deque<int> myDeque;
  deque<int>::iterator it;

  myDeque.push_back(1); // 1
  myDeque.push_back(2); // 1 2
  myDeque.push_front(3); // 3 1 2
  it = myDeque.begin();it++;
  myDeque.insert(it, 4); // 3 4 1 2
  it = myDeque.begin();it++;
  deque<int> myOtherDeque (2,5);
  myDeque.insert(it,myOtherDeque.begin(),myOtherDeque.end()); // 3 5 5 4 1 2

  cout << "myDeque contains:";
  for (it=myDeque.begin(); it!=myDeque.end(); ++it)
    cout << ' ' << *it;
  cout << '\n';

  return 0;
}

运行结果为:

myDeque contains: 3 5 5 4 1 2
双向删除

要从deque的特定位置删除一个或多个元素,可以使用以下函数:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void pop_back();
void pop_front();
  • erase(const_iterator position):删除位置position上的元素。
  • erase(const_iterator first, const_iterator last):删除[first, last)中所有的元素。
  • pop_back():删除最后一个元素。
  • pop_front():删除第一个元素。

例如:

#include <iostream>
#include <deque>

using namespace std;

int main () {
  deque<int> myDeque;
  deque<int>::iterator it;

  myDeque.push_back(1); // 1
  myDeque.push_back(2); // 1 2
  myDeque.push_front(3); // 3 1 2
  it = myDeque.begin();it++;
  myDeque.insert(it, 4); // 3 4 1 2
  it = myDeque.begin();it++;
  deque<int> myOtherDeque (2,5);
  myDeque.insert(it,myOtherDeque.begin(),myOtherDeque.end()); // 3 5 5 4 1 2

  it = myDeque.end();it--;
  myDeque.erase(it); // 3 5 5 4 1
  myDeque.pop_front(); // 5 5 4 1

  cout << "myDeque contains:";
  for (it=myDeque.begin(); it!=myDeque.end(); ++it)
    cout << ' ' << *it;
  cout << '\n';

  return 0;
}

运行结果为:

myDeque contains: 5 5 4 1
访问Deque

要访问deque中的元素,可以使用以下函数:

reference operator[] (size_type n);
reference at (size_type n);
reference front();
reference back();
  • operator[](size_type n):返回下标为n的元素,并允许修改。
  • at(size_type n):返回下标为n的元素,并且使用该函数访问超出边界的元素会抛出out_of_range异常。
  • front():返回第一个元素。
  • back():返回最后一个元素。

例如:

#include <iostream>
#include <deque>

using namespace std;

int main () {
  deque<int> myDeque;
  deque<int>::iterator it;

  myDeque.push_back(1); // 1
  myDeque.push_back(2); // 1 2
  myDeque.push_front(3); // 3 1 2
  it = myDeque.begin();it++;
  myDeque.insert(it, 4); // 3 4 1 2
  it = myDeque.begin();it++;
  deque<int> myOtherDeque (2,5);
  myDeque.insert(it,myOtherDeque.begin(),myOtherDeque.end()); // 3 5 5 4 1 2

  cout << "myDeque contains:";
  for (size_t i=0; i<myDeque.size(); i++)
    cout << ' ' << myDeque[i];
  cout << '\n';

  return 0;
}

运行结果为:

myDeque contains: 3 5 5 4 1 2
其他函数

deque提供了许多其他有用的函数,如size()、empty()、clear()等函数。

例如:

#include <iostream>
#include <deque>

using namespace std;

int main () {
  deque<int> myDeque;
  deque<int>::iterator it;

  myDeque.push_back(1); // 1
  myDeque.push_back(2); // 1 2
  myDeque.push_front(3); // 3 1 2
  it = myDeque.begin();it++;
  myDeque.insert(it, 4); // 3 4 1 2
  it = myDeque.begin();it++;
  deque<int> myOtherDeque (2,5);
  myDeque.insert(it,myOtherDeque.begin(),myOtherDeque.end()); // 3 5 5 4 1 2

  myDeque.clear();
  cout << "Size of myDeque: " << myDeque.size() << endl;
  if (myDeque.empty())
    cout << "myDeque is empty" << endl;

  return 0;
}

运行结果为:

Size of myDeque: 0
myDeque is empty
总结

以上就是关于C++ STL中deque的介绍,包括创建、双向插入、双向删除、访问元素以及其他函数。Deque在实际编程中非常有用,它能够处理插入和删除操作,而不强制将所有元素移动到数组尾部或开头完成这些操作。