📜  C++ STL中的vector :: at()和vector :: swap()(1)

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

C++ STL中的vector::at()和vector::swap()

1. vector::at()

vector::at()vector类中的成员函数,用于访问容器中指定位置的元素。和vector::operator[]一样,都是使用下标访问元素,但是不同的是,vector::at()会进行边界检查,如果下标超出了容器的范围,会抛出一个std::out_of_range异常。而vector::operator[]不会进行边界检查,如果下标超出了容器的范围,程序会导致未定义的行为。

1.1 语法
reference at (size_type n);
const_reference at (size_type n) const;

at()函数接受一个size_type类型的参数n,表示需要访问的元素的下标,返回一个引用,可以用来获取或修改该元素的值。const_at()版本返回一个常量引用,用于避免修改该元素的值。

1.2 示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3};

    try {
        std::cout << "v[3]: " << v[3] << std::endl;  // 未定义行为
    }
    catch (...) {
        std::cout << "Caught an exception in v[3]" << std::endl;
    }

    try {
        std::cout << "v.at(3): " << v.at(3) << std::endl;  // 抛出std::out_of_range异常
    }
    catch (const std::out_of_range& e) {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

输出:

Caught an exception in v[3]
vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)
2. vector::swap()

vector::swap()vector类中的成员函数,用于交换两个vector对象的内容。这种交换方式非常高效,只需交换两个指针,而不需要执行任何迭代器的复制或移动操作。

2.1 语法
void swap (vector& x) noexcept;

swap()函数接受一个vector类型的参数x,表示需要与当前vector对象交换的另一个vector对象,noexcept关键字表示该函数不会抛出异常。

2.2 示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v1{1, 2, 3};
    std::vector<int> v2{4, 5, 6};

    std::cout << "Before swap:" << std::endl;
    std::cout << "v1: ";
    for (const auto& i : v1) std::cout << i << ' ';
    std::cout << std::endl;
    std::cout << "v2: ";
    for (const auto& i : v2) std::cout << i << ' ';
    std::cout << std::endl;

    v1.swap(v2);

    std::cout << "After swap:" << std::endl;
    std::cout << "v1: ";
    for (const auto& i : v1) std::cout << i << ' ';
    std::cout << std::endl;
    std::cout << "v2: ";
    for (const auto& i : v2) std::cout << i << ' ';
    std::cout << std::endl;

    return 0;
}

输出:

Before swap:
v1: 1 2 3 
v2: 4 5 6 
After swap:
v1: 4 5 6 
v2: 1 2 3