c++:向量问题的向量

Posted

技术标签:

【中文标题】c++:向量问题的向量【英文标题】:c++: vector of vector issue 【发布时间】:2013-09-29 01:18:01 【问题描述】:

我编写了一个 c++ 代码,我正在测试向量 push_back 的运行时间。我有一个向量的向量。我称我的主向量 mainVec 和嵌入向量 subVec。因此,我将支持的 2^20 个元素推入 subVec,然后将支持的 subVec 2^20 次推入 mainVec。但是,在 subVec-push_back 的循环中,我有一个未执行的 cout 命令。我希望你能指出我的错误。

这是代码(不过代码中没有错误):

vector<int> subVec; 
vector< vector<int> > mainVec;

//Fills the subvector with 2^20 elements
for( size_t i = 0; i < (pow(2,20)+1); ++i) subVec.push_back(i);

//Filling of the maiVec with 2^20 subVec
for( size_t j = 10; j < 21; ++j) 
    cout << pow(2,j) << endl;
    clock_t t1 = clock();

    //2^j times subVec is push_backed for j < 21
    for( size_t k = 0; k < pow(2,j); ++k ) mainVec.push_back( subVec );

    t1 = clock()-t1;

    //Outputting to file
    cout << "\t" << (float(t1) / CLOCKS_PER_SEC) << endl;
    //ofs << pow(2,j) << "\t\t" << (float(t1) / CLOCKS_PER_SEC) << endl;

【问题讨论】:

为什么是 2^20? cout 是否适用于 2^20-1? 简化。 2^20 个 2^20 个整数的向量?您有超过 4 TB 的内存? 大声笑没关系的家伙。我将程序更改为只有两个循环。第二个上升到 2^8。 【参考方案1】:

您的代码有几个问题。

首先,您不需要在第一个循环中使用 +1,即。 pow(2,20)+1。由于您从 0 开始并且想要 2^20 次,因此您需要一直执行到 i&lt;2^20

其次,最好在循环之前计算pows,否则它会每次都计算它们,这可能需要很长时间。

第三,你可以用1&lt;&lt;j代替pow(2,j)。仅供参考。

第四,也是最重要的,我们在这里谈论的是大量的内存。即使是最小的循环也在执行 2^30 个整数,即 4GB 内存。我的猜测是您的程序只是在杀死您的计算机,它从不打印第二个cout 的原因是它没有到​​达那里(因为它试图使用交换文件作为内存)。尝试使用较小的数字,例如 2^10 用于第一个循环,看看是否得到输出。

【讨论】:

谢谢,我不关心程序计算 pow 所需的时间,因为我对此不感兴趣。我只对 push_back subVec 所需的时间感兴趣。 但是您的评论很有帮助。我现在只有两个循环,第二个循环小于 2^8,我认为这仍然是巨大的,哈哈 @Cheetahjimi 2^8 只有 256,这太小了。但是第一个循环有多大?还是2^20吗?如果是这样,请尝试将其设为 2^10。只是看看你是否得到了输出。

以上是关于c++:向量问题的向量的主要内容,如果未能解决你的问题,请参考以下文章

C++中向量的向量顺序

向量c++的向量大小

关于C++中的二维向量

(向量对)与(向量对)C++的速度[关闭]

C++ 按列对二维向量进行排序

为啥我不能将整数向量推入 C++ 中的二维整数向量?