写leetcode的时候遇到了cannot create std::vector larger than max_size()的问题,说是我创建的int向量超过max_size()了
查资料说在leetcode playground中没有初始化的int类成员变量是一个非常大的数字,其它编译器中就不一定了,也有定义为0的就不会出现这个错误提示,见 g++ -std=c++11 类成员变量的默认值和初始化顺序的实验)。
更改result括号里的值依旧报错。。心累。。
写leetcode的时候遇到了cannot create std::vector larger than max_size()的问题,说是我创建的int向量超过max_size()了
查资料说在leetcode playground中没有初始化的int类成员变量是一个非常大的数字,其它编译器中就不一定了,也有定义为0的就不会出现这个错误提示,见 g++ -std=c++11 类成员变量的默认值和初始化顺序的实验)。
更改result括号里的值依旧报错。。心累。。
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在C++中,std::vector是动态大小的可变容器,它会根据新的元素添加到容器内部,并且可以自动调整其大小以容纳新的元素。如果尝试将一个标准大小(最大容量为max_size())的std::vector扩展到更大的容量,会出现以下两种情况:
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, 因此,无法满足要求并导致上述错误。
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++)下不会出现错误,而在其他环境下可能出现。