2016-06-09 2 views
0

특정 값으로 벡터를 채울 필요가 있습니다. 나는 a.size()이 0에서 변경되지 않는다는 점을 제외하고 아래 코드가 작동한다는 것을 알았습니다. 요소를 넣은 후 크기 조정 호출을 추가하는 것은 거의 두 배 오래 걸립니다. 어떤 요소도 변경할 필요가 없으므로 크기를 업데이트하는 O (1) 방법이 있어야합니다. 거기 있니? 그냥 신경 쓰지 않아도 될까요?std : : 예약 및 채우기 후 벡터 크기가 업데이트되지 않습니다.

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.reserve(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; //successfully prints as 1 
    cout << a.size(); //confusingly prints as 0 
} 

편집 : 링크 된 질문이 벤치마킹을 다루지 않으므로 중복되지 않습니다. 그것은 단지 예비의 차이와 크기를 묻습니다. 나는 그것에 대해 묻지 않습니다. 이 코드는 효과적이고 빠르지 만, size()를 "틀리게"남기는 추악한 부작용이 있습니다.

+2

이 *는 * 중복입니다. 코드가 손상되었습니다. 현재 컴퓨터에서 작동한다는 사실은 부적절합니다. 단위화된 메모리에 액세스합니다. – Ven

답변

2

std::vector::reserve()은 요소를 만들 수 없습니다. 요소를 만들려면 std::vector::resize()을 사용할 수 있습니다.

이 시도 :

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.resize(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; 
    cout << a.size(); 
} 
+0

예비는 요소를 생성하지 않는다는 것을 알고 있습니다. 반복적으로 push_back을 할 때처럼 반복되는 크기 조정을 방지합니다. 귀하의 방법이 나에게 발생했지만, 나는 동일한 일을 성취하기 위해 광산에서 3.78 대신에 5.45 초에 그것을 벤치 마크했다. 이것이 O (1)이어야하는 50 % 벌칙? –

+2

@DavidLerner * 3.78 *에 대한? 정의되지 않은 동작이있는 코드가 깨졌습니까? – juanchopanza

+0

@juanchopanza 같은 것을 달성하는 코드. 나는'a [2]'를 출력하여 결과를 확인하기까지했다. –

관련 문제