矩阵乘法、vector 容器、C++、秋招面经、算法刷题
写在前面的话
金九银十,秋招在即,最近有没有打卡学习呢?今天我们借洛谷的一道面试笔试题B2105来学一学线性代数的矩阵乘法和C++ vector 容器的简单使用。
一、矩阵乘法
1.1 定义
矩阵的乘法指的是一般矩阵的乘积,设A为 m x p 的矩阵,B为 p x n 的矩阵,那么称 m x n 的矩阵C为矩阵A与B的乘积,记作C= AB.
1.2 运算
若要把矩阵与矩阵相乘,我们要计算行与列的"点积"。
这是什么意思?
这里我们来看个例子
求 第一行 和 第一列 :
“点积” 是把 对称的元素相乘,然后把结果加起来:
(1, 2, 3) • (7, 9, 11) = 1×7 + 2×9 + 3×11 = 58
这是第一行与第二列:
(1, 2, 3) • (8, 10, 12) = 1×8 + 2×10 + 3×12 = 64
同理我们可以得到剩下的两个元素的值
二、vector 容器
vector 是C++标准模板库(STL)中的一个动态数组类。它提供了动态调整大小的功能,并且可以方便地进行元素的插入、删除和访问操作,不需要手动分配和释放内存。
2.1 基本特性
- 动态大小:vector 的大小可以根据需要自动增长和缩小。
- 连续存储:vector 中的元素在内存中是连续存储的,这使得访问元素非常快速。
- 可迭代:vector 可以被迭代,你可以使用循环(如 for 循环)来访问它的元素。
- 元素类型:vector 可以存储任何类型的元素,包括内置类型、对象、指针等。
2.2 使用场景
- 当你需要一个可以动态增长和缩小的数组时。
- 当你需要频繁地在序列的末尾添加或移除元素时。
- 当你需要一个可以高效随机访问元素的容器时。
注意:要使用 vector,需要包含头文件
#include <vector>
2.3 函数方法
1.定义
std::vector,其中 T 是元素的类型。
std::vector<int> myVector; // 创建一个存储整数的空 vector
2.初始化
std::vector myVector; 或 std::vector myVector(n, value),在创建时指定初始大小和初始值。
std::vector<int> myVector(5); // 创建一个包含 5 个整数的 vector,每个值都为默认值(0)
std::vector<int> myVector(5, 10); // 创建一个包含 5 个整数的 vector,每个值都为 10
3.访问元素
myVector[i] 或 myVector.at(i),使用下标操作符 [] 或 at() 方法访问 vector 中的元素
int x = myVector[0]; // 获取第一个元素
int y = myVector.at(1); // 获取第二个元素
3.添加元素
myVector.push_back(value),使用 push_back 方法向 vector 中添加元素
myVector.push_back(7); // 将整数 7 添加到 vector 的末尾
4.删除元素:
myVector.erase() ,使用erase() 方法删除 vector 中的元素
myVector.erase(myVector.begin() + 2); // 删除第三个元素
5.获取大小
myVector.size(),使用 size() 方法获取 vector 中元素的数量
int size = myVector.size(); // 获取 vector 中的元素数量
6.清空
myVector.clear(),使用 clear() 方法清空 vector 中的所有元素
myVector.clear(); // 清空 vector
2.4 简单示例
2.4.1 一维 vector
以下是一个完整的使用实例,包括创建 vector、添加元素、访问元素以及输出结果
示例代码
#include <iostream>
#include <vector>
int main() {
// 创建一个空的整数向量
std::vector<int> myVector;
// 添加元素到向量中
myVector.push_back(3);
myVector.push_back(7);
myVector.push_back(11);
myVector.push_back(5);
// 访问向量中的元素并输出
std::cout << "Elements in the vector: ";
for (int element : myVector) {
std::cout << element << " ";
}
std::cout << std::endl;
// 访问向量中的第一个元素并输出
std::cout << "First element: " << myVector[0] << std::endl;
// 访问向量中的第二个元素并输出
std::cout << "Second element: " << myVector.at(1) << std::endl;
// 获取向量的大小并输出
std::cout << "Size of the vector: " << myVector.size() << std::endl;
// 删除向量中的第三个元素
myVector.erase(myVector.begin() + 2);
// 输出删除元素后的向量
std::cout << "Elements in the vector after erasing: ";
for (int element : myVector) {
std::cout << element << " ";
}
std::cout << std::endl;
// 清空向量并输出
myVector.clear();
std::cout << "Size of the vector after clearing: " << myVector.size() << std::endl;
return 0;
}
2.4.2 二维 vector
二维 vector 可以看作是 vector 的 vector,即 std::vector<std::vector>。
示例代码
#include <iostream>
#include <vector>
int main() {
// 创建一个3x3的二维整数向量,并将所有元素初始化为0
std::vector<std::vector<int>> myMatrix(3, std::vector<int>(3, 0));
// 添加元素到二维向量中
myMatrix[0][0] = 1;
myMatrix[0][1] = 2;
myMatrix[0][2] = 3;
myMatrix[1][0] = 4;
myMatrix[1][1] = 5;
myMatrix[1][2] = 6;
myMatrix[2][0] = 7;
myMatrix[2][1] = 8;
myMatrix[2][2] = 9;
// 访问二维向量中的元素并输出
std::cout << "Elements in the matrix:" << std::endl;
for (const auto& row : myMatrix) {
for (int element : row) {
std::cout << element << " ";
}
std::cout << std::endl;
}
// 访问二维向量中的特定元素并输出
std::cout << "Element at (0, 1): " << myMatrix[0][1] << std::endl;
std::cout << "Element at (2, 2): " << myMatrix[2][2] << std::endl;
// 获取二维向量的大小并输出
std::cout << "Number of rows: " << myMatrix.size() << std::endl;
std::cout << "Number of columns in the first row: " << myMatrix[0].size() << std::endl;
// 修改二维向量中的元素
myMatrix[1