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

本文分析了C++中intarr[3][4]和vector<vector<int>>在内存管理、初始化、元素访问、内存布局以及效率方面的区别,指出在不同应用场景下的选择策略。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值