当前位置: 首页 > 知识库问答 >
问题:

C++向量的极限

宰父志新
2023-03-14

std::vector类有问题,我创建了一个struct

struct Triplet{
    int first;
    int second;
    int third;
};

我创建了一个向量 ; T 。 我的问题是它不会包含我所需要的那么多元素,即使t.max_size()=357913941我使用该函数只得到t.size()=60540697t.size()=40360465

vector<Triplet> T;
while(true)
{
    Triplet t;
    t.first = 1; t.second = 1 ; t.third = 1;
    try {
        T.push_back(t);
    } catch (...) {
        break;
    }
}

qDebug() << T.size();

有谁能解释一下它为什么要这样做吗? 我运行在Windows 10和16GO的RAM上,使用Qt和VSC++2017x86(由于Lemon库,我无法编译x64),

共有1个答案

乔鸿骞
2023-03-14

std::vector需要一个连续(=没有空穴)的内存块来存在。 此外,当将元素推送到向量时,您可能会超出内部容量,这意味着它必须为另一个std::vector(通常是两倍的大小)分配内存,并将元素复制过来。

请记住,在32位Windows程序中,无论您的系统有多少内存,您在单个进程中只有2 GB可用内存空间可供使用。 大小为60540697*12的矢量占了其中的700+MB。 根本没有地方分配下一个大小(1.4GB),因为内存空间太小。

最简单的解决方案是在64位模式下编译,这种模式有充足的虚拟内存。 作为一种临时解决方案,您可以尝试用t.reserve(80000000)左右在std::vector中预分配空间。 这将避免中间复制,但可能还不够。 如果您的内存空间以一种糟糕的方式被碎片化,它甚至可能失败!

 类似资料:
  • 错误:与“运算符”不匹配 我想同一个键和多个值,例如键是10值是2,3,4,但“*iter”是错误的..如何用c语言计算map,vector?

  • 本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。

  • 我是C语言的新手,正在尝试根据另一个向量中的值对向量进行排序。我试图通过创建结构向量并使用STL对结构向量进行排序来实现这一点。结构有两个数据项,一个是CustomType,另一个是int。我希望按int字段的降序排序,因此包含一个布尔运算符重载,以便能够使用STL排序(算法)。 在函数中使用对CustomType向量和初始未初始化的int向量的引用构造结构,并将它们组合成结构向量。int的值是通

  • 下面是可以用于WebScarab, JBroFuzz, WSFuzzer, ZAP或者其它漏洞检测工具的漏洞检测向量。 漏洞检测是一种"混合情况"的方法,用来测试参数被操作时应用程序的反应。一般来说,我们寻找一个应用程序产生的错误情况,来作为漏洞检测的结果。这是发现阶段最简单的部分。一旦一个错误被发现,指出它并利用一个潜在的漏洞就需要技术了。 模糊测试分类 在无状态的网络协议(比如HTTP(S))

  • 我试图使用Visual Studio 2015 Enterprise compiler在W10上编译libSVM,但出现了此错误。我键入nmake-f makefile。赢 Microsoft(R)Program Maintenance Utility版本14.00.24210.0版权所有(C)Microsoft Corporation。保留所有权利。 timer.cpptimer.cpp(26)

  • 我有以下向量: 现在我想按奇指数对向量进行字典排序(如果奇指数相等,则按偶数指数)。使得排序向量“vec”为: 我知道d::排序将完全排序“vec”。是否可以使用d::排序来选择性地对向量进行排序。d::lower_bound类似。是否可以仅使用奇数索引来查找lower_bound。 我想要与对向量相同的效果。出于效率原因,我不将vec存储为对向量。

  • /usr/include/C++/4.8/ext/new_allocator.h:在实例化'void__gnu_cxx::new_allocator<_tp>::construct(_up*,_args&&...)[with_up=UNDIR_W_EDGE;_args={const UNDIR_W_EDGE&};_tp=UNDIR_W_EDGE]':/usr/include/c++/4.8/bit

  • 问题内容: 我正在使用Java本机功能- 在C ++中,我的本机函数- 我的问题是如何将resultList(向量类型)转换为jobject类型? 问题答案: 您必须在C ++中为ArrayList创建包装器。就像是: 有关更多信息,请参见: http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html