在这篇文章中,我们将了解deque背后的概念以及在C++ 标准模板库(STL)中初始化deque的不同方法。
目录:
- 什么是deque?
- C++默认构造函数
- C++填充构造函数
- C++范围构造函数
- C++移动构造函数
- C++复制构造函数
- C++initializer_list构造函数
让我们开始了解在C++ STL中初始化Deque的不同方法。
什么是Deque?
Deque,也被称为双端队列,是STL的索引序列容器的一部分。Deque的好处是它有能力在两端(前面和后面)扩展和收缩,通过在运行时插入和删除元素。与向量不同,deque不在连续的内存位置存储其元素,其内存通常是动态分配的。下面是一个deque的可视化表示。
为了实现一个deque,我们必须首先使用STL中的 "deque "类作为头。这使得我们可以使用STL中的任何函数。我们还将使用命名空间std来实现,以使编码过程更加简洁:
#include <deque>
using namespace std;
下面是我们将在本文中使用的成员函数的列表:
- **size():**返回deque包含的元素总数
- **begin():**返回deque的第一个元素
下面列出了从deque头初始化deque的6种方法:
- C++默认构造函数
- C++填充构造函数
- C++范围构造函数
- C++移动构造函数
- C++复制构造函数
- 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中的元素。
- push_front():在deque的前面插入新元素。
- push_back():在deque的末端插入新的元素。
- pop_front():从deque中移除第一个元素。
- 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的实际应用
- 互联网浏览器历史记录:最近访问过的网站会被插入到deque的一端,当达到历史记录的上限时,前面的元素会从deque中移除,以便为新的插入腾出空间。
- 存储一个软件应用程序的撤销操作列表。
问题
使用C++默认构造函数来创建deque的时间复杂度是多少?
O(n)
O(1)
O(log n)
O(n log n)
时间复杂度是常数O(1),因为deque最初是空的,不包含要遍历的元素。
通过OpenGenus的这篇文章,你一定对C++ STL中初始化Deque的不同方法有了完整的了解。