2013-09-29 180 views
0

我写了一个C++代码,我在测试向量push_back的运行时间。我有一个矢量矢量。我打电话给我的主矢量mainVec和嵌入矢量subVec。所以,我推送2^20元素到subVec中,然后将支持的subVec 2^20次推入mainVec。但是,在subVec-push_back的循环中,我有一个不能执行的cout命令。我希望你能指出我的错误。C++:向量问题向量

下面是代码(没有错误代码,虽然):

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; 
} 
+1

为什么2^20? 'cout'对2^20-1是否正常工作? *简化。* – Beta

+1

2^20整数的2^20个向量?你有超过4太字节的内存? –

+0

哈哈没关系的人。我改变了我的程序只有两个循环。第二个上升到2^8。 –

回答

0

有你的代码的几个问题。

首先,您不需要第一个循环中的+1,即。 pow(2,20)+1。既然你从0开始,你想要2^20次,你需要做的,直到i<2^20。其次,最好在循环之前计算pow,否则每次都会计算它们,这可能需要花费很长时间。

第三,你可以做1<<j而不是pow(2,j)。只是FYI。

第四,最重要的是,我们在此讨论大量的记忆。即使你最小的循环做2^30整数,这是4GB的内存。我的猜测是你的程序只是在杀死你的电脑,而它从不打印第二个cout的原因是它没有到​​达那里(因为它试图使用交换文件作为内存)。尝试使用较小的数字,例如2^10作为第一个循环,然后查看是否获得输出。

+0

谢谢,我不在乎程序计算pow的时间,因为我对此不感兴趣。我只对push_back subVec花费的时间感兴趣。 –

+0

但您的评论是有帮助的。我现在只有两个循环,第二个循环小于2^8,我认为它仍然很大lol –

+0

@Cheetahjimi 2^8只有256,这很小。但第一个循环有多大?还是2^20?如果是这样,请尝试制作2^10。只是为了看看你是否得到了输出。 – rabensky