在C++ STL中初始化Deque的不同方法

677 阅读2分钟

在这篇文章中,我们将了解deque背后的概念以及在C++ 标准模板库(STL)中初始化deque的不同方法。

目录:

  1. 什么是deque?
  2. C++默认构造函数
  3. C++填充构造函数
  4. C++范围构造函数
  5. C++移动构造函数
  6. C++复制构造函数
  7. C++initializer_list构造函数

让我们开始了解在C++ STL中初始化Deque的不同方法。

什么是Deque?

Deque,也被称为双端队列,是STL的索引序列容器的一部分。Deque的好处是它有能力在两端(前面和后面)扩展和收缩,通过在运行时插入和删除元素。与向量不同,deque不在连续的内存位置存储其元素,其内存通常是动态分配的。下面是一个deque的可视化表示。

Deque--2-
为了实现一个deque,我们必须首先使用STL中的 "deque "类作为头。这使得我们可以使用STL中的任何函数。我们还将使用命名空间std来实现,以使编码过程更加简洁:

#include <deque> 
using namespace std;

下面是我们将在本文中使用的成员函数的列表:

  1. **size():**返回deque包含的元素总数
  2. **begin():**返回deque的第一个元素

下面列出了从deque头初始化deque的6种方法:

  1. C++默认构造函数
  2. C++填充构造函数
  3. C++范围构造函数
  4. C++移动构造函数
  5. C++复制构造函数
  6. C++初始化器_列表构造器

让我们来看看每种方式的初始化细节。

1.C++默认构造器

C++默认构造器将给我们提供构造一个空deque的能力,并以零元素初始化它。这种初始化技术使我们的时间复杂度为0(1)。

实施

int main() {

   deque<int> d;

   cout << "Size of deque = " << d.size() << endl;

   return 0;
}

输出

Size of deque = 0

2. C++填充构造器

C++填充构造函数将使我们能够构造和初始化一个有n个元素的deque,并为每个元素分配一个。使用[]可以让我们访问deque的特定元素。这种初始化技术给了我们一个线性时间复杂度为0(n)

执行

int main() {

   deque<int> d(4, 7);

   cout << "Elements of deque are" << endl;

   for (int i = 0; i < d.size(); ++i)
      cout << d[i] << endl;

   return 0;
}

输出

Elements of deque are
7
7
7
7

3. C++范围构造器

C++范围构造器将给我们提供构建一个deque的能力,并使用{}对其进行初始化,元素的范围在第一最后之间。这种初始化技术给了我们一个线性时间复杂度为0(n)

实施

int main() {

   deque<int> d1 = {1, 2, 3, 4, 5, 6, 7};
   deque<int> d2(d1.begin(), d1.begin() + 5);

   cout << "Elements of deque are" << endl;

   for (int i = 0; i < d2.size(); ++i)
      cout << d2[i] << endl;

   return 0;
}

输出

Elements of deque are
1
2
3
4
5

4. C++移动构造函数

C++移动构造器将给我们提供构建一个新的deque的能力,并用另一个deque的元素来初始化。这种初始化技术给了我们一个线性时间复杂度为0(n)

实施

int main() {

   deque<int> d1 = {1, 2, 3, 4};
   deque<int> d2(move(d1));

   cout << "Size of deque d1 is " << d1.size() << endl;
   cout << endl;

   cout << "Elements of deque d2 are" << endl;

   for (int i = 0; i < d2.size(); i++)
      cout << d2[i] << endl; 

   return 0;
}

输出

Size of deque d1 is 0

Elements of deque d2 are
1
2
3
4

5. C++复制构造器

C++的复制构造器将给我们提供构建一个新的deque的能力,并用另一个现有deque中的元素的副本来初始化它。这种初始化技术给了我们一个线性时间复杂度为0(n)

实施

int main() {

   deque<int> d1 = {1, 2, 3};
   deque<int> d2(d1);

   cout << "Elements of deque d2 are" << endl;

   for (int i = 0; i < d2.size(); ++i)
      cout << d2[i] << endl;

   return 0;
}

输出

Elements of deque d2 are
1
2
3

6. C++initializer_list构造函数

C++ initializer_list构造器将使我们能够从先前初始化的列表中构造一个deque。这种初始化技术给了我们一个0(n)的线性时间复杂度

执行

int main() {

   auto list = {1, 2, 3};
   deque<int> d(list);

   cout << "Elements of deque d are" << endl;

   for (int i = 0; i < d.size(); i++)
      cout << d[i] << endl;

   return 0;
}

输出

Elements of deque d are
1
2
3

以下是deque的成员函数,可以用来插入和移除deque中的元素。

  1. push_front():在deque的前面插入新元素。
  2. push_back():在deque的末端插入新的元素。
  3. pop_front():从deque中移除第一个元素。
  4. pop_back():从deque中删除最后一个元素

push_front()和push_back()的实现

int main() {

  deque<int> dequeList;
  dequeList.push_front(1); // SECOND IN LIST INDEX 1
  dequeList.push_front(2); // FRONT OF LIST INDEX 0
  dequeList.push_back(3);  // INDEX 2
  dequeList.push_back(4);  // INDEX 3
  
  for (int i = 0; i < dequeList.size(); i++)
      cout << dequeList[i] << endl;
}

输出

2
1
3
4

pop_front()和pop_back()的实现

int main() {

  deque<int> dequeList;
  dequeList.push_front(1); // SECOND IN LIST INDEX 1
  dequeList.push_front(2); // FRONT OF LIST INDEX 0
  dequeList.push_back(3);  // INDEX 2
  dequeList.push_back(4);  // INDEX 3
  
  dequeList.pop_back(); 
  dequeList.pop_front(); 
  
  
  for (int i = 0; i < dequeList.size(); i++)
      cout << dequeList[i] << endl;
}

输出

1
3

deque的实际应用

  1. 互联网浏览器历史记录:最近访问过的网站会被插入到deque的一端,当达到历史记录的上限时,前面的元素会从deque中移除,以便为新的插入腾出空间。
  2. 存储一个软件应用程序的撤销操作列表。

问题

使用C++默认构造函数来创建deque的时间复杂度是多少?

O(n)

O(1)

O(log n)

O(n log n)

时间复杂度是常数O(1),因为deque最初是空的,不包含要遍历的元素。

通过OpenGenus的这篇文章,你一定对C++ STL中初始化Deque的不同方法有了完整的了解。