在 C++ STL 中的deque::operator= 和 deque::operator[]
在 C++ STL 中,deque
是一个双端队列容器,支持常数时间复杂度的随机访问和插入/删除操作。它的 operator=
和 operator[]
是两个常用的成员函数,本文将重点介绍它们的用法和注意事项。
deque::operator=
deque::operator=
是重载赋值运算符的函数,用来将一个双端队列对象赋值给另一个。它有以下几种用法:
- 拷贝构造函数:使用一个已有的双端队列对象来初始化一个新的双端队列对象。
#include <deque>
#include <iostream>
int main() {
std::deque<int> mydeque1 = {1, 2, 3};
std::deque<int> mydeque2 = mydeque1; // 使用拷贝构造函数
for (auto i : mydeque2) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3
- 赋值运算符:用一个双端队列对象来替换另一个双端队列对象。
#include <deque>
#include <iostream>
int main() {
std::deque<int> mydeque1 = {1, 2, 3};
std::deque<int> mydeque2 = {4, 5, 6};
mydeque2 = mydeque1; // 使用赋值运算符
for (auto i : mydeque2) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3
- 移动赋值运算符:用一个双端队列对象来替换另一个双端队列对象,并将被替换的对象置为默认状态。
#include <deque>
#include <iostream>
int main() {
std::deque<int> mydeque1 = {1, 2, 3};
std::deque<int> mydeque2 = {4, 5, 6};
mydeque2 = std::move(mydeque1); // 使用移动赋值运算符
for (auto i : mydeque2) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3
需要注意的是,如果双端队列中包含指针或引用等指向堆内存的成员,赋值运算符可能会导致内存泄漏或悬空指针等问题。此时应该手动释放内存或者使用智能指针解决该问题。
deque::operator[]
deque::operator[]
是重载下标运算符的函数,用来访问双端队列中的元素。它与数组的访问方式类似,支持随机访问,时间复杂度为 O(1)。例如:
#include <deque>
#include <iostream>
int main() {
std::deque<int> mydeque = {1, 2, 3, 4, 5};
std::cout << mydeque[0] << std::endl; // 1
std::cout << mydeque[2] << std::endl; // 3
std::cout << mydeque[4] << std::endl; // 5
return 0;
}
输出:
1
3
5
需要注意的是,deque::operator[]
不会检查下标是否越界,如果访问了超出边界的元素,程序将会出现未定义的行为,可能会导致程序崩溃或数据损坏。因此,在使用 deque::operator[]
访问元素时一定要确保下标在有效范围内。可以使用 at()
成员函数来进行边界检查,该函数在下标越界时会抛出 std::out_of_range
异常。例如:
#include <deque>
#include <iostream>
#include <stdexcept>
int main() {
std::deque<int> mydeque = {1, 2, 3, 4, 5};
try {
std::cout << mydeque.at(6) << std::endl;
} catch (std::out_of_range e) {
std::cout << "Out of range error: " << e.what() << std::endl;
}
return 0;
}
输出:
Out of range error: deque::at: __n (which is 6) >= this->size() (which is 5)
总结
deque::operator=
和 deque::operator[]
是 C++ STL 中 deque
容器最常用的成员函数之一。使用时需要注意避免内存泄漏、悬空指针等问题,并在使用下标访问元素时进行边界检查。在实际应用中,双端队列的高效性和便捷性往往需要与其他容器进行比较和取舍,具体使用时需要结合实际情况仔细考虑。