2013-04-22 2 views
1

처음에는 생각했던 것처럼 간단한 것이 생각보다 어렵습니다. 복사 생성자 안에 int 유형의 벡터 벡터를 복사하려고합니다. 복사 생성자의 벡터 벡터 복사

std::vector<std::vector<int> * > * bar; 

나는이 시도하지만 작동하지 않습니다 : 나는 swapback() 뭔가를 사용할 수 있다면 나 또한 생각하지만,이 운동을하면 나는 확실하지 않다

Foo(const Foo& rhs) 
: bar(new std::vector<std::vector<int> * >(rhs.vec->size())) { 

    for (std::size_t i = 0; i < rhs.bar->size(); i++) { 
     bar->push_back(new std::vector<int>()); 
     for (size_t j = 0; j < (*rhs.bar)[i]->size(); j++) { 
      bar->back()->push_back((*rhs.bar)[i]->at(j)); 
     } 
    } 
} 

.

누군가 나에게 적절한 방법을 보여줄 수 있습니까? 미리 도움을 주셔서 감사합니다!

+2

"벡터 유형 벡터의 벡터"가 실제로있는 경우 복사 생성자에서 특별한 작업을 수행 할 필요가 없습니다. 왜 그 모든 포인터를 사용하고 있습니까? – Chad

+0

포인터가'std :: vector *> * bar; '인지 정말 필요한가요? – lucasmrod

+1

이것은 끔찍한 코드입니다. "곱셈"을 의미하지 않는다면 C++에서'*'를 말하지 마십시오. –

답변

6

실제 저장 유형이 int이므로이 경우 포인터를 사용하지 않아도됩니다. 포인터를 사용하지 않도록 멤버 변수를 변경하고 vector 개체의 복사 생성자가 작업을 수행하게하십시오.

class T 
{ 
public: 
    T() {}; 

    // For this class, the copy constructor isn't even necessary! 

private: 
    std::vector<std::vector<int>> v_; 
}; 
+0

예, 알아요, 포인터를 사용하지 않으면 복사 생성자 (및 대입 연산자)가 중복됩니다. 위의 스토리지 문제가 발생했습니다. 깨어 주셔서 감사합니다! –

2

당신 당신이 (int 치의에 벡터에 대한 포인터의 벡터에 대한 포인터)를 보여 무엇을, int 치의 벡터의 벡터, 그리고 말을하는 경우, 그 객체는 그것을 할 수 있습니다 이미. 복사 생성자 또는 대입 연산자를 사용하면됩니다.

std::vector<std::vector<int> > vec; 
std::vector<std::vector<int> > copy_of_vec = vec; 

예, 모든 포인터를 제거하면 정말 간단합니다.

관련 문제