int arr[3][4] 和 vector<vector<int>> arr(3, vector<int>(4)) 都是用于存储二维数组的数据结构,但它们之间有以下几个差异:
1. 内存管理:int arr[3][4] 是一个静态数组,它在编译时就分配了连续的内存空间,大小不可变。而 vector<vector<int>> arr(3, vector<int>(4)) 是一个动态数组,它在运行时分配内存,可以动态地调整大小。
2. 初始化:int arr[3][4] 在定义时可以使用初始化列表来初始化元素,而 vector<vector<int>> arr(3, vector<int>(4)) 在创建时可以通过构造函数来初始化元素。
3. 访问元素:int arr[3][4] 可以使用下标运算符直接访问元素,而 vector<vector<int>> arr(3, vector<int>(4)) 需要使用两个下标运算符来访问元素,例如 arr[i][j]。
4. 内存布局:int arr[3][4] 在内存中是连续存储的,因此可以使用指针运算来访问元素。而 vector<vector<int>> arr(3, vector<int>(4)) 在内存中是分散存储的,每个一维数组都是一个独立的内存块,因此不能使用指针运算来访问元素。
5. 效率:int arr[3][4] 由于是静态数组,因此访问元素的效率较高。而 vector<vector<int>> arr(3, vector<int>(4)) 由于是动态数组,因此在插入和删除元素时需要进行内存分配和释放,因此效率较低。
总之,这两种数据结构各有优缺点,在具体应用中需要根据实际情况选择合适的数据结构。如果需要存储大小固定的二维数组,可以使用 int arr[3][4]。如果需要存储大小可变的二维数组,可以使用 vector<vector<int>> arr(3, vector<int>(4))。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 创建一个3行4列的二维数组
vector<vector<int>> arr(3, vector<int>(4));
// 为二维数组赋值
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
arr[i][j] = i * 4 + j;
}
}
// 输出二维数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
int arr2[3][4];
// 为二维数组赋值
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
arr2[i][j] = i * 4 + j;
}
}
// 输出二维数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cout << arr2[i][j] << " ";
}
cout << endl;
}
return 0;
}
--
C++ 标准库中的 `vector` 容器类是一个动态数组,它提供了一系列方法用于管理元素。以下是 `vector` 容器类的一些基本方法:
1. `vector<T> v;` 创建一个空的 `vector` 容器,其中 `T` 是元素的数据类型。
2. `vector<T> v(n);` 创建一个包含 `n` 个元素的 `vector` 容器,每个元素的值都是 `T` 的默认值。
3. `vector<T> v(n, val);` 创建一个包含 `n` 个元素的 `vector` 容器,每个元素的值都是 `val`。
4. `v.push_back(val);` 在 `vector` 容器的末尾添加一个值为 `val` 的元素。
5. `v.pop_back();` 删除 `vector` 容器的末尾元素。
6. `v.size();` 返回 `vector` 容器中元素的个数。
7. `v.empty();` 如果 `vector` 容器为空,则返回 `true`,否则返回 `false`。
8. `v.front();` 返回 `vector` 容器中第一个元素的引用。
9. `v.back();` 返回 `vector` 容器中最后一个元素的引用。
10. `v.clear();` 清空 `vector` 容器中的所有元素。
11. `v.insert(pos, val);` 在 `vector` 容器中的 `pos` 位置插入一个值为 `val` 的元素。
12. `v.erase(pos);` 删除 `vector` 容器中的 `pos` 位置的元素。
13. `v.at(i);` 返回 `vector` 容器中下标为 `i` 的元素的引用。
14. `v[i];` 返回 `vector` 容器中下标为 `i` 的元素的引用。
15. `v.begin();` 返回一个迭代器,指向 `vector` 容器中的第一个元素。
16. `v.end();` 返回一个迭代器,指向 `vector` 容器中的最后一个元素的下一个位置。
这些方法可以用于在 `vector` 容器中添加、删除、访问和遍历元素。需要注意的是,在使用这些方法时需要确保 `vector` 容器中有足够的元素,否则可能会导致程序崩溃或产生未定义行为。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 创建一个空的 vector 容器
vector<int> v;
// 在 vector 容器的末尾添加元素
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
// 访问 vector 容器中的元素
cout << "The first element is " << v.front() << endl;
cout << "The last element is " << v.back() << endl;
cout << "The size of the vector is " << v.size() << endl;
// 使用下标访问元素
v[1] = 10;
cout << "The second element is " << v[1] << endl;
// 使用迭代器访问元素
vector<int>::iterator it = v.begin();
while (it != v.end()) {
cout << *it << " ";
it++;
}
cout << endl;
// 在 vector 容器中的指定位置插入元素
v.insert(v.begin() + 1, 5);
cout << "After inserting 5, the vector is: ";
for (std::vector<int>::size_type i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
// 删除 vector 容器中的元素
v.erase(v.begin() + 1);
cout << "After erasing the second element, the vector is: ";
for (std::vector<int>::size_type i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
// 清空 vector 容器
v.clear();
cout << "After clearing the vector, the size is " << v.size() << endl;
return 0;
}