2017-02-02 1 views
1

나는 두 개의 클래스 A가 있고 B가 모두 회원이 아래와 같이 있습니다표준 : : 사본이 작동하지 않습니다 제대로

class A { 
    ... 
    std::vector<std::vector<std::vector<size_t>>> grid; 
} 

class B { 
    ... 
    std::vector<std::vector<std::vector<size_t>>> grid; 
} 

나는 A와 B :: 그리드에서 복사 표준 : : 사본을 사용할 때 내가 발견 :: 그리드, 그것은 실패합니다.

// Here is in B's constructor. 
// I initialize B::grid with the same size of A::grid 
grid = vector<vector<vector<size_t>>>(GetSetting().grid_cols()); 
for (int i = 0; i < GetSetting().grid_cols(); i++) { 
    grid[i] = vector<vector<size_t>>(GetSetting().grid_rows()); 
    for (int j = 0; j < GetSetting().grid_rows(); j++) { 
    grid[i][j].reserve(a.grid[i][j].size()); 
    } 
} 

// Copy from A to B 
std::copy(a.grid.begin(), a.grid.end(), std::back_inserter(grid)); 

을하지만 일부를 초기화 제거하는 경우, 다음 표준 : : 복사가 잘 작동합니다 : 여기 내가 할 것입니다. 부품 초기화가 잘못 되었습니까?

+1

왜 그리드를하지 않는거야? –

+0

@ T.C. , 나는 또한 연산자 =()를 사용하려고 시도하고 올바르게 작동합니다. 나는 단지 std :: copy를 사용하면서 무엇이 잘못 되었는가를 알고 싶다. – Josper

답변

1

간단한 예를 들어 설명해 드리겠습니다.

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1; 
std::copy(v.begin(), v.end(), std::back_inserter(v1)); 

이 시나리오에서 v1은 예상대로 1, 2, 3이됩니다. 이제이 고려 :

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1(3); //v1 has initial size!! 
std::copy(v.begin(), v.end(), std::back_inserter(v1)); 

지금 V1은 0, 0, 0, 1, 2, 3, 때문에 back_inserter push_back의 것입니다. 예상대로

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1(3); //v1 has initial size!! 
std::copy(v.begin(), v.end(), v1.begin()); //use begin here 

(V1)가, 2, 3, 1 : 당신은 이미 목적지에 필요한 크기를 할당 한 경우, begin() 반복자가 아닌 back_insert_iterator를 사용합니다.

+0

대답 해 주셔서 감사합니다. 정말 혼란 스럽네요. 다른 질문을해도 될까요? grid [i] [j] .reserve (a.grid [i] [j] .size())를 수정할 때; grid [i] [j] .resize (a.grid [i] [j] .size()); back_inserter를 사용하면 잘 작동합니다. 차이점은 무엇이며 예약 및 크기 조정은 무엇입니까? 저장소가 버퍼를 유지하고 크기를 조정하면 크기가 초기화된다는 것을 알고 있습니다. 하지만 왜 크기가 올바르게 작동할까요? – Josper

+0

@Josper : 그리드 [i] [j]로 할 일은 아무 것도 생각하지 않습니다. 예비 크기를 조정하면 효과가 있습니다. 중요한 것은 그리드 자체의 크기를 조정할지 여부입니다. –

관련 문제