C++二维数组arr[3][4]与arr(3, vector<int>(4))的差异

server/2024/9/25 8:24:05/

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;
}


http://www.ppmy.cn/server/20325.html

相关文章

RabbitMQ消息是如何分发的,消息是怎么路由的, RabbitMQ中的交换机类型有哪些

目录 面试官:讲一下RabbitMQ消息如何分发和消息怎么路由的?消息分发消息路由RabbitMQ中的交换机类型示例Spring Boot代码示例1. 直接路由(Direct Exchange)2. 扇出路由(Fanout Exchange)3. 主题路由(Topic Exchange)4. 头路由(Headers Exchange)该文章专注于面试,面…

debian配置BIND DNS服务器

前言 局域网内有很多台主机&#xff0c;IP难以记忆。 而修改hosts文件又难以做到配置共享和统一&#xff0c;需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog&#xff0c;将其指向为192.168.1.100。 同时&#xff0c;外网的域名不会受到影响&#xff0c;…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据&#xff0c;并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

【学习记录】autoware标定相机与激光雷达外参

一、autoware选择 这里踩了好几个坑&#xff0c;首先autoware作为一个无人驾驶知名框架&#xff0c;其内部实际上是有两套标定的东西的&#xff0c;这一点绝大多数博客没有提到。其中最常用的是一个叫标定工具箱的东西&#xff0c;这个ros包已经在1.10往后的版本中被删掉了&am…

微信小程序的常用API②

一、动画API &#xff08;1&#xff09;作用&#xff1a;用于在微信小程序中完成动画效果的制作 &#xff08;2&#xff09;使用&#xff1a;创建实例 wx.createAnimation() &#xff08;3&#xff09;常用属性&#xff1a; duration 【number型】 动画持续时间&…

Python爬虫--Ajax异步抓取腾讯视频评论

在某些网站 &#xff0c;当我们滑下去的时候才会显示出后面的内容 就像淘宝一样&#xff0c;滑下去才逐渐显示其他商品 这个就是采用 Ajax 做的 然后我们现在就是要编写这样的爬虫。 规律分析&#xff1a; 这个时候就要用到我们的 Fiddler 了 我们需要分析加载评论的规律 …

CST Studio初级教程 三

本节教程主要讲解CST中常用的选取操作&#xff0c;CST是一款3D软件&#xff0c;一个3D模型的构成离不开点、线面、特征等&#xff0c;选取操作也就是选取这些内容。 选取快捷键 S 按下快捷键S&#xff0c;可选取点&#xff08;Points&#xff09;、棱线&#xff08;Edges&…

用C实现通讯录(详细讲解+源码)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容会给大家带来通讯录的讲解&#xff0c;主要是利用结构体来实现通讯录&#xff0c;该通讯…