C++中vector<vector<int> > ***使用教程

vector<vector >后面的尖括号前面要加上空格,否则在有些编译器可能出现问题

1、定义二维vector
vector<vector<int> > pre;
访问二维vector的元素: 如果指定外层和内层向量的大小,就可用operator[]进行读和写;如果只指定外层向量大小,就能用push_back()函数进行写,不能用operator[]进行读和写。

  1. 创建m*n的二维vector:
vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二维vector

定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
vector(n)表示构造一个无名且含n个0的vector对象。

  1. 动态创建m*n的二维vector
    方法一:
vector<vector <int> > nums;
nums.resize(m);
for(int i=0;i<m;i++) nums[i].resize(n);

方法二:

vector<vector <int> > nums;
nums.resize(m,vector<int>(n));
  1. 初始化二维数组
vector<vector <int> > nums(m ,vector<int>(n,0)); //m*n的二维vector,所有元素为0

获得二维数组的行数:nums.size();
获得二维数组的列数:nums[0].size()

  1. 数组遍历
int m = nums.size(),n = nums[0].size();
for(int i = 0; i < m; i++){
    for(int j = 0; j < n; j++){
        cout<<nums[i][j]<<endl;
    }
}

2、 vector< vector<int> > v(m, vector<int>(n) );
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
从结果上看,类似于创建了一个m×n的二维数组,而且可以通过v[i][j]的方式来访问元素(vector支持下标访问元素)。

3、 vector< vector <int> > dp(m, vector<int>(n) )

vector<类型>标识符(最大容量,初始所有值)
vector< vector<int> > v(m, vector<int>(n) );

定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

<think>好的,我现在要回答用户关于C++vector<int*>和vector<int>的区别的问题。首先,我需要理解用户的问题核心,他们想了解这两种容器在使用上的不同之处。接下来,我需要从内存管理、访问元素、使用场景等方面展开分析。 首先,vector<int>存储的是整数本身,而vector<int*>存储的是指向整数的指针。这意味着在内存分配上,vector<int>的元素是连续存放的整数值,而vector<int*>则是连续存放的指针,每个指针指向可能分散在内存中的整数。这里需要注意内存管理的问题,尤其是vector<int*>需要手动管理指针所指向的内存,避免内存泄漏。 然后,访问元素时,vector<int>可以直接通过下标或迭代器访问整数值,而vector<int*>则需要解引用指针才能获取到实际的整数值。例如,对于vector<int> vec,vec[0]就是整数;而对于vector<int*> pvec,*pvec[0]才是整数。这里可能会涉及到空指针或悬垂指针的风险,特别是当指针指向的内存被释放后,访问会导致未定义行为。 接下来,使用场景方面。vector<int>适用于需要直接操作整数值的情况,比如存储数据集合并进行数值计算。而vector<int*>常用于需要共享或动态管理内存的情况,例如多个容器共享同一组数据,或者需要延迟对象的创建和销毁。此外,在需要多态性时,可能会使用指向基类的指针,但这里用户的问题是关于intint*,所以可能不涉及多态,但指针容器可以灵活处理动态分配的对象。 还需要考虑拷贝和赋值时的行为差异。vector<int>在拷贝时会复制所有整数值,而vector<int*>拷贝时只是复制指针,导致多个vector共享同一组数据。如果用户希望深拷贝,就需要自己遍历指针并分配新内存,这会增加复杂性。 此外,性能方面,vector<int>由于数据连续,缓存局部性更好,访问速度可能更快。而vector<int*>的指针可能指向不同内存区域,导致缓存命中率降低,影响性能。不过,如果数据本身很大,使用指针可以减少容器复制的开销,但需要权衡利弊。 最后,总结两者的主要区别,强调内存管理、访问方式、使用场景和性能差异。同时,结合用户提供的引用内容,特别是关于代理类和Lambda表达式的内容,可能可以举例说明如何在操作这些容器时使用Lambda来简化代码,比如使用std::for_each处理指针的解引用和操作。 可能用户还会有疑问,比如如何安全地管理指针容器的内存,这时候可以建议使用智能指针(如unique_ptr或shared_ptr)来代替原始指针,以自动管理内存,避免泄漏。但用户的问题可能集中在int*和int的区别,所以是否需要提及智能指针呢?根据用户的问题,可能不需要,但可以作为扩展建议。 现在需要检查是否有遗漏点,比如容器的插入、删除操作是否有所不同,或者迭代器的使用差异。例如,对vector<int*>进行排序时,可能需要自定义比较函数来比较指针指向的值,而不是指针本身的地址。这也是一个使用上的区别。 总结,回答需要结构清晰,分点列出区别,并结合示例代码说明,同时引用用户提供的资料中的相关内容,比如使用Lambda表达式处理容器操作。</think>在C++中,`std::vector<int*>`(指向整数的指针容器)与`std::vector<int>`(整数容器)有以下核心区别: --- ### 1. **内存分配与管理** - **`vector<int>`** 直接存储整数值,所有元素在内存中连续分布。容器自动管理内存,无需手动释放。 ```cpp std::vector<int> vec = {1, 2, 3}; // 存储实际整数 ``` - **`vector<int*>`** 存储指向整数的指针,指针指向的内存需手动管理(动态分配/释放)。容器仅管理指针本身,不管理指针指向的内存。 ```cpp std::vector<int*> pvec; pvec.push_back(new int(10)); // 需手动分配内存 // 必须手动释放:delete pvec[0]; ``` --- ### 2. **访问元素** - **`vector<int>`** 直接通过下标或迭代器访问整数值: ```cpp int a = vec[0]; // 直接获取值 ``` - **`vector<int*>`** 需通过解引用指针访问实际值,需注意空指针或悬垂指针风险: ```cpp int b = *pvec[0]; // 解引用获取值 ``` --- ### 3. **使用场景** - **`vector<int>`** - 需要直接操作整数值的场景(如数值计算)。 - 数据所有权明确,容器生命周期内无需共享数据。 - **`vector<int*>`** - 需要共享数据(多个容器指向同一数据)[^1]。 - 动态管理内存(如延迟创建对象)。 - 需自定义排序/比较逻辑时(基于指针指向的值)。 --- ### 4. **拷贝与赋值行为** - **`vector<int>`** 拷贝时会复制所有整数值,新容器与原容器独立。 ```cpp std::vector<int> vec2 = vec; // 深拷贝 ``` - **`vector<int*>`** 拷贝时仅复制指针,新旧容器共享同一组数据。 ```cpp std::vector<int*> pvec2 = pvec; // 浅拷贝 // 修改 pvec2[0] 会影响 pvec[0] ``` --- ### 5. **性能与缓存** - **`vector<int>`** 数据连续存储,缓存局部性更好,访问速度快。 - **`vector<int*>`** 指针指向的内存可能分散,缓存命中率较低,但可减少大对象复制的开销。 --- ### 示例代码 ```cpp // 使用 Lambda 操作 vector<int*> std::vector<int*> pvec = {new int(1), new int(2)}; std::for_each(pvec.begin(), pvec.end(), [](int* ptr) { *ptr *= 2; // 通过指针修改值 }); // 使用后需手动释放内存 for (auto ptr : pvec) delete ptr; ``` --- ### 总结 | 特性 | `vector<int>` | `vector<int*>` | |---------------------|------------------------------------|-------------------------------------| | **内存管理** | 自动管理 | 需手动分配/释放指针指向的内存 | | **数据共享** | 不支持 | 支持多容器共享数据 | | **访问复杂度** | O(1) 直接访问 | O(1) 访问,需额外解引用 | | **适用场景** | 直接操作数据、高性能计算 | 动态内存管理、多态对象存储 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值