2013-09-29 2 views
0

나는 push_back 벡터의 실행 시간을 테스트하고있는 C++ 코드를 작성했습니다. 나는 벡터의 벡터를 가지고있다. 나는 메인 벡터 인 mainVec과 임베디드 벡터 인 subVec를 호출했다. 그래서, 지원 된 2^20 요소를 subVec으로 밀어 넣고 mainVec에 backVec 2^20 번을 밀어 넣습니다. 그러나, 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에서 올바르게 작동합니까? * Simplify. * – Beta

+1

2^20 int의 2^20 벡터입니까? 4 테라 바이트 이상의 메모리가 있습니까? –

+0

Lol Nevermind 얘들 아. 프로그램을 두 개의 루프로 변경했습니다. 두 번째 것은 2^8까지 올라갑니다. –

답변

0

: 여기

코드 (오류가 있지만, 코드에 없다)입니다.

먼저 첫 번째 루프에는 +1이 필요하지 않습니다. 즉, pow(2,20)+1. 0으로 시작하고 2^20을 원하기 때문에 i<2^20까지해야합니다.

두 번째로 루프 앞에 pow을 계산하는 것이 더 좋습니다. 그렇지 않으면 매회 계산되고 영원히 걸릴 수 있습니다.

세 번째로 pow(2,j) 대신 1<<j을 사용할 수 있습니다. 그냥 참고하시기 바랍니다.

앞서 언급했듯이, 가장 중요한 것은 여기서 우리는 엄청난 양의 기억에 대해 말하고 있습니다. 심지어 가장 작은 루프는 4GB의 메모리 인 2^30 ints를 수행합니다. 내 추측은 프로그램이 단지 컴퓨터를 죽이고 두 번째 파일을 출력하지 않는 이유입니다. cout은 메모리에 스왑 파일을 사용하려고하기 때문에 거기에 도달하지 않는다는 것입니다. 더 작은 숫자를 사용해보십시오. 첫 번째 루프에 2^10이라고 말하면 출력을 얻는 지 확인하십시오.

+0

감사합니다. 프로그램에 대한 관심이 없어서 프로그램이 pow를 계산하는 데 걸리는 시간에 대해서는 신경 쓰지 않습니다. 나는 push_back subVec에 걸리는 시간에만 관심이있다. –

+0

그러나 귀하의 의견은 도움이되었습니다. 나는 단지 두 번째 루프가 2^8보다 적은 두 개의 루프를 가지고있다. 나는 여전히 거대하다라고 생각한다. –

+0

@Cheetahjimi 2^8은 256이다. 하지만 첫 번째 루프가 얼마나 큰가요? 아직도 2^20입니까? 그렇다면 2^10으로 만들어보십시오. 출력을 얻는 지 확인하기 만하면됩니다. – rabensky