在 C++ STL 中的deque::operator= 和 deque::operator[]

在 C++ STL 中的deque::operator= 和 deque::operator[]

C++ STL 中,deque 是一个双端队列容器,支持常数时间复杂度的随机访问和插入/删除操作。它的 operator=operator[] 是两个常用的成员函数,本文将重点介绍它们的用法和注意事项。

deque::operator=

deque::operator= 是重载赋值运算符的函数,用来将一个双端队列对象赋值给另一个。它有以下几种用法:

  1. 拷贝构造函数:使用一个已有的双端队列对象来初始化一个新的双端队列对象。
#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 
  1. 赋值运算符:用一个双端队列对象来替换另一个双端队列对象。
#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 
  1. 移动赋值运算符:用一个双端队列对象来替换另一个双端队列对象,并将被替换的对象置为默认状态。
#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 容器最常用的成员函数之一。使用时需要注意避免内存泄漏、悬空指针等问题,并在使用下标访问元素时进行边界检查。在实际应用中,双端队列的高效性和便捷性往往需要与其他容器进行比较和取舍,具体使用时需要结合实际情况仔细考虑。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程