c++ 关于vector容器开辟空间问题

reference binding to null pointer of type 'int' (stl_vector.h)

首先给大家抛出一个error:

Line 1034: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9

产生原因:

1.对于一些stl和一些数据结构掌握不准确;

2.缺少判断条件(导致数组下标越界);

这是在做leetcode题遇到的排序问题,我写了一个归并排序

class Solution {
public:
vector<int> s;
void merge_sort(int l,int r,vector<int>& nums){
    if(l>=r)return;
    int mid=(l+r)>>1;
    merge_sort(l,mid,nums),merge_sort(mid+1,r,nums);
    int i=l,j=mid+1,t=0;
    while(i<=mid && j<=r){
        if(nums[i]<=nums[j])s[t++]=nums[i++];
        else s[t++]=nums[j++];
    }
    while(i<=mid) s[t++]=nums[i++];
    while(j<=r) s[t++]=nums[j++];
    for(int i=l,j=0;i<=r;i++,j++){
        nums[i]=s[j];
    }
}
    void sortColors(vector<int>& nums) {
        merge_sort(0,nums.size()-1,nums);
    }
};

作者:全都是你
链接:https://leetcode.cn/circle/discuss/WvKolR/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.这个算法本身没有问题,错误原因是没有对s数组分配空间,导致数组下标越界,出现错误

原来以为的是vector是动态数组,不需要额外申请空间。其实是需要的,因为后边有是s[t++],是需要有数组下标的。

那么如何申请空间那:vactor<int>s(100,0) 100为申请的空间数,0为每一个空间存储的数,即这一百个数都为零。

2.对于vector数组为空的情况也要判断,如果不判断,也会出现报错。

所以要加一行代码:if (s.size()==0) return;

总结

这类错误多数是因为在编程的过程中由于一些判断或者初始化的细节没有考虑到,解决很简单,但是很容易被忽略,所以家人们遇到这种报错就可以想一想是不是数组下标越界,或者没有对数组分配空间,以及加判断非空条件

### 如何在C++中为`vector`开辟空间 #### 使用构造函数初始化大小 可以直接通过指定初始容量来创建 `std::vector` 对象。这会预先分配内存并设置向量的大小。 ```cpp #include <vector> int main() { std::vector<int> vec(10); // 创建一个含有10个整数的空间,默认初始化为0 } ``` 当使用这种方式时,不仅分配了足够的存储位置给定数量的对象,而且这些对象也会被默认构造出来[^1]。 #### 预留额外容量以提高性能 如果预计将来要增加大量元素到容器内,则可以调用成员函数 `reserve()` 来提前预留更多内部缓冲区: ```cpp vec.reserve(20); // 这不会改变当前 size(), 只会影响 capacity() ``` 此操作仅影响底层数组的最大容纳能力而不实际修改现有数据项的数量;即它调整的是capacity而非size[]^1]。 #### 动态扩展与收缩 每当超出已有的可用范围时,标准库实现通常会选择自动增长其内部使用的连续块状区域。然而,在某些情况下手动管理可能更有效率——比如频繁插入/删除场景下减少不必要的复制开销。对于这种情况下的优化措施之一就是利用移动语义特性。 例如下面展示了如何定义一个带有转移构造器 (move constructor) 的类模板实例化版本: ```cpp template<typename T> class MyVector { public: MyVector(MyVector&& a) noexcept // 移动构造函数 :sz{a.sz}, elem{a.elem} // 复制 'a' 的成员变量 { a.sz = 0; // 将源对象置为空状态 a.elem = nullptr; } }; ``` 上述代码片段说明了怎样高效地接管另一个临时对象所持有的资源而无需深拷贝每一个单独元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值