qq_45194531 2021-03-29 21:44 采纳率: 0%
浏览 828

cannot create std::vector larger than max_size()?

写leetcode的时候遇到了cannot create std::vector larger than max_size()的问题,说是我创建的int向量超过max_size()了查资料说在leetcode playground中没有初始化的int类成员变量是一个非常大的数字,其它编译器中就不一定了,也有定义为0的就不会出现这个错误提示,见 g++ -std=c++11 类成员变量的默认值和初始化顺序的实验)。

更改result括号里的值依旧报错。。心累。。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 20:24
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在C++中,std::vector是动态大小的可变容器,它会根据新的元素添加到容器内部,并且可以自动调整其大小以容纳新的元素。如果尝试将一个标准大小(最大容量为max_size())的std::vector扩展到更大的容量,会出现以下两种情况:

    1. 如果试图将max_size()添加到已有的std::vector,则会发生内存溢出。这是因为std::vector的空间限制取决于它的初始大小以及新添加元素的数量。当max_size()等于或大于sizeof(std::vector)时,即使我们继续增加新的元素,也无法再向其中添加更多的元素。
    // 尝试将size()等于max_size()的vector扩大
    std::vector<std::vector<int>> biggerVector = {{1, 2}, {3, 4}, {5, 6}};
    

    在这种情况下,由于biggerVector的大小为{{1, 2}, {3, 4}, {5, 6}},而std::vector的最大容量是5, 因此,无法满足要求并导致上述错误。

    1. 如果试图将max_size()视为一个全局静态数组的指针,因为代码并未在编译阶段初始化std::vector,那么在编译过程中,编译器可能会分配足够大的存储空间给整个数组,这样就可以将其扩展到更大的容量。例如,在G++编译器中,通过提供-std=c++17选项,我们可以指定一个默认的静态数组大小为1024。
    // 在编译阶段初始化std::vector
    std::vector<std::vector<int>> biggerVector = {{1, 2}, {3, 4}, {5, 6}};
    

    但是,需要注意的是,这种方式可能导致静态数组访问效率降低,因为在静态数组的索引需要遍历整个数组才能查找目标元素,这在大型数据集上可能消耗大量时间和额外的空间。

    为了避免上述问题,如果你打算将max_size()视为一个全局静态数组的指针,你可以使用数组范围替换的方式进行扩容:

    // 使用数组范围替换实现扩大存储空间
    std::vector<std::vector<int>> biggerVector;
    biggerVector.resize(maxSize + 1);
    
    for (const auto& pair : biggerVector) {
        pair.push_back({1, 2});
    }
    
    // 注意这里使用resize方法来扩展数组而不是将max_size作为指针传递给构造函数
    

    在上述代码中,我们将biggerVector的大小设为maxSize + 1,这样当我们再次插入新的元素时,程序只会从剩余空间开始逐个填充元素,避免了内存溢出的风险。

    请注意,这种方法适用于当前std::vector的内建动态数组大小不超过max_size()的情况。如果想要处理更大规模的std::vector,你需要提供适当的数据结构(如多维数组、链表等),或者对std::vector进行适当的优化,使其具有更适合您需求的功能。此外,确保你使用的max_size()实际代表了你可以容纳的最大的整数,并确保你理解了为什么你的问题在某些编程语言和环境(如G++)下不会出现错误,而在其他环境下可能出现。

    评论

报告相同问题?