C++ <vector> back 函数
在 vector 的各种操作中,back 是一个非常实用的函数,用于获取最后一个元素。
back 是容器类的成员函数,用于返回容器的最后一个元素。它相当于 at(size()-1) 或 operator[](size()-1),但语义更清晰。
back 提供了直观的方式来访问容器的末尾元素,常用于栈、队列等数据结构的实现。
单词释义: back 表示"后面",即获取最后一个(最后面的)元素。
基本语法与参数
back 是容器类的成员函数,调用它非常直接,不需要任何参数。
语法格式
reference back(); const_reference back() const;
参数说明
- 参数: 无参数
back不接受任何参数。
函数说明
- 返回值: 返回容器最后一个元素的引用。如果容器是常量容器,则返回常量引用。
- 效果: 返回容器的最后一个元素(索引
size()-1处的元素)。 - 注意: 调用
back前应确保容器不为空,否则行为是未定义的。建议先使用empty()或size() > 0检查。
实例
让我们通过一系列例子,彻底掌握 back 的用法。
示例 1:基础用法 - 获取最后一个元素
实例
#include <iostream>
#include <vector>
int main() {
// 1. 创建一个 vector 并添加一些元素
std::vector<int> numbers = {10, 20, 30, 40, 50};
std::cout << "vector的大小是: " << numbers.size() << std::endl;
// 2. 使用 back 获取最后一个元素
std::cout << "最后一个元素 (back): " << numbers.back() << std::endl;
std::cout << "使用 at(size()-1): " << numbers.at(numbers.size() - 1) << std::endl;
std::cout << "使用 [size()-1]: " << numbers[numbers.size() - 1] << std::endl;
return 0;
}
#include <vector>
int main() {
// 1. 创建一个 vector 并添加一些元素
std::vector<int> numbers = {10, 20, 30, 40, 50};
std::cout << "vector的大小是: " << numbers.size() << std::endl;
// 2. 使用 back 获取最后一个元素
std::cout << "最后一个元素 (back): " << numbers.back() << std::endl;
std::cout << "使用 at(size()-1): " << numbers.at(numbers.size() - 1) << std::endl;
std::cout << "使用 [size()-1]: " << numbers[numbers.size() - 1] << std::endl;
return 0;
}
运行结果预期:
vector的大小是: 5 最后一个元素 (back): 50 使用 at(size()-1): 50 使用 [size()-1]: 50
代码解析:
numbers.back()返回最后一个元素50。- 它与
numbers.at(numbers.size()-1)和numbers[numbers.size()-1]返回相同的值,但语义更明确。
示例 2:修改最后一个元素的值
back 返回的是引用,因此可以用来修改元素的值。
实例
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks = {"学习 C++", "写作业", "阅读文档"};
std::cout << "修改前,最后一个任务: " << tasks.back() << std::endl;
// 使用 back() 获取引用并修改元素
tasks.back() = "完成项目";
std::cout << "修改后,最后一个任务: " << tasks.back() << std::endl;
// 现在 tasks 的内容是: 学习 C++, 写作业, 完成项目
return 0;
}
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks = {"学习 C++", "写作业", "阅读文档"};
std::cout << "修改前,最后一个任务: " << tasks.back() << std::endl;
// 使用 back() 获取引用并修改元素
tasks.back() = "完成项目";
std::cout << "修改后,最后一个任务: " << tasks.back() << std::endl;
// 现在 tasks 的内容是: 学习 C++, 写作业, 完成项目
return 0;
}
运行结果预期:
修改前,最后一个任务: 阅读文档 修改后,最后一个任务: 完成项目
代码解析:
tasks.back() = "完成项目";通过引用修改了最后一个元素的值。back()返回的是可修改的左值引用。
示例 3:安全使用 back - 检查容器是否为空
在使用 back 前,应先检查容器是否为空。
实例
#include <iostream>
#include <vector>
void printBack(const std::vector<int>& v) {
if(!v.empty()) {
std::cout << "最后一个元素是: " << v.back() << std::endl;
}
else {
std::cout << "容器为空,无法获取最后一个元素" << std::endl;
}
}
int main() {
std::vector<int> numbers = {10, 20, 30};
// 正常情况
printBack(numbers);
// 空容器情况
std::vector<int> emptyVec;
printBack(emptyVec);
return 0;
}
#include <vector>
void printBack(const std::vector<int>& v) {
if(!v.empty()) {
std::cout << "最后一个元素是: " << v.back() << std::endl;
}
else {
std::cout << "容器为空,无法获取最后一个元素" << std::endl;
}
}
int main() {
std::vector<int> numbers = {10, 20, 30};
// 正常情况
printBack(numbers);
// 空容器情况
std::vector<int> emptyVec;
printBack(emptyVec);
return 0;
}
运行结果预期:
最后一个元素是: 30 容器为空,无法获取最后一个元素
代码解析:
!v.empty()检查容器是否不为空。- 在调用
back前进行检查可以避免未定义行为。
示例 4:使用 back 实现栈
back 常用于实现栈数据结构(配合 push_back 和 pop_back)。
实例
#include <iostream>
#include <vector>
class Stack {
private:
std::vector<int> data;
public:
// 入栈
void push(int value) {
data.push_back(value);
}
// 出栈
void pop() {
if(!data.empty()) {
data.pop_back();
}
}
// 获取栈顶元素
int top() {
if(!data.empty()) {
return data.back();
}
return 0; // 表示栈为空
}
// 判断栈是否为空
bool empty() {
return data.empty();
}
// 获取栈的大小
size_t size() {
return data.size();
}
};
int main() {
Stack s;
// 入栈操作
s.push(10);
s.push(20);
s.push(30);
std::cout << "栈的大小: " << s.size() << std::endl;
std::cout << "栈顶元素 (back): " << s.top() << std::endl;
// 出栈操作
s.pop();
std::cout << "出栈后,栈顶元素: " << s.top() << std::endl;
s.pop();
std::cout << "再出栈后,栈顶元素: " << s.top() << std::endl;
s.pop();
std::cout << "再出栈后,栈是否为空: " << (s.empty() ? "是" : "否") << std::endl;
return 0;
}
#include <vector>
class Stack {
private:
std::vector<int> data;
public:
// 入栈
void push(int value) {
data.push_back(value);
}
// 出栈
void pop() {
if(!data.empty()) {
data.pop_back();
}
}
// 获取栈顶元素
int top() {
if(!data.empty()) {
return data.back();
}
return 0; // 表示栈为空
}
// 判断栈是否为空
bool empty() {
return data.empty();
}
// 获取栈的大小
size_t size() {
return data.size();
}
};
int main() {
Stack s;
// 入栈操作
s.push(10);
s.push(20);
s.push(30);
std::cout << "栈的大小: " << s.size() << std::endl;
std::cout << "栈顶元素 (back): " << s.top() << std::endl;
// 出栈操作
s.pop();
std::cout << "出栈后,栈顶元素: " << s.top() << std::endl;
s.pop();
std::cout << "再出栈后,栈顶元素: " << s.top() << std::endl;
s.pop();
std::cout << "再出栈后,栈是否为空: " << (s.empty() ? "是" : "否") << std::endl;
return 0;
}
运行结果预期:
栈的大小: 3 栈顶元素 (back): 30 出栈后,栈顶元素: 20 再出栈后,栈顶元素: 10 再出栈后,栈是否为空: 是
代码解析:
back()用于获取栈顶元素(最后入栈的元素)。- 栈是后进先出(LIFO)数据结构,
back()正好对应栈顶。
示例 5:动态获取最大值
使用 back 配合 sort 获取排序后的最大元素。
实例
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
int main() {
std::srand(std::time(nullptr));
std::vector<int> numbers;
// 随机生成 5 个数
for(int i = 0; i < 5; ++i) {
numbers.push_back(std::rand() % 100);
}
std::cout << "原始数据: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 排序
std::sort(numbers.begin(), numbers.end());
std::cout << "排序后: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
std::cout << "最小值 (front): " << numbers.front() << std::endl;
std::cout << "最大值 (back): " << numbers.back() << std::endl;
return 0;
}
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
int main() {
std::srand(std::time(nullptr));
std::vector<int> numbers;
// 随机生成 5 个数
for(int i = 0; i < 5; ++i) {
numbers.push_back(std::rand() % 100);
}
std::cout << "原始数据: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 排序
std::sort(numbers.begin(), numbers.end());
std::cout << "排序后: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
std::cout << "最小值 (front): " << numbers.front() << std::endl;
std::cout << "最大值 (back): " << numbers.back() << std::endl;
return 0;
}
代码解析:
- 排序后,
front()返回最小值,back()返回最大值。 - 这是一种简单获取最大/最小值的方法。

C++ 容器类 <vector>