📅  最后修改于: 2023-12-03 15:13:56.923000             🧑  作者: Mango
vector::at()
是vector
类中的成员函数,用于访问容器中指定位置的元素。和vector::operator[]
一样,都是使用下标访问元素,但是不同的是,vector::at()
会进行边界检查,如果下标超出了容器的范围,会抛出一个std::out_of_range
异常。而vector::operator[]
不会进行边界检查,如果下标超出了容器的范围,程序会导致未定义的行为。
reference at (size_type n);
const_reference at (size_type n) const;
at()
函数接受一个size_type
类型的参数n
,表示需要访问的元素的下标,返回一个引用,可以用来获取或修改该元素的值。const_at()
版本返回一个常量引用,用于避免修改该元素的值。
#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)
vector::swap()
是vector
类中的成员函数,用于交换两个vector
对象的内容。这种交换方式非常高效,只需交换两个指针,而不需要执行任何迭代器的复制或移动操作。
void swap (vector& x) noexcept;
swap()
函数接受一个vector
类型的参数x
,表示需要与当前vector
对象交换的另一个vector
对象,noexcept
关键字表示该函数不会抛出异常。
#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