[C++] vector<> 를 이용한 배열 질문입니다.
글쓴이: kldpzone / 작성시간: 목, 2005/08/11 - 8:36오후
vector<>나 link<> 등을 이용해서 프로그램을 재미있게 짜고 있습니다.
그런데 vector<> 가 그냥 1차 배열인데 2차 배열로 하려니까 아이디어가 잘 떠오르지 않네요.
원래 구상이 2차원배열을 linkedlist로 구현해 보자라는 생각이었습니다. 배열중 값을 가진 곳만 체크할수 있게 만들려고요.
list<> 에서 data값이 다시 list로 구현이 되나요?
보통 list<int> 등 data값이 정해지는데 일단 vector로 이리 저리 몇줄 안되지만 해보곤 하지만
vector< vector<int> > a; a.push_back(b);
이런식으로 이러저리 해봤는데 에러만 나네요.
그냥 제가 만든 linkedlist로 구현은 쉽지만 요즘 STL에 빠져서 이것저것 하고 있는데 생각보다 구현이 잘 안되네요.
센스 있으신 분의 간단한 설명 부탁드립니다.
Forums:
컴파일 잘됩니다.구형 컴파일러(VC 6.0 등)에서는 안될수도 있으니
컴파일 잘됩니다.
구형 컴파일러(VC 6.0 등)에서는 안될수도 있으니,
비교적 최신 컴파일러에서 실행시켜보세요.
[code:1]vector< vector<int> &
에서
부분을 정의 안해줬네요.
다시 다른 부분 고민해봐야겠습니다.
감사합니다
STL이 재미있으시다니 다행이군요. 어렵다고 하시는 분이 가끔 계셔서요.
STL이 재미있으시다니 다행이군요. 어렵다고 하시는 분이 가끔 계셔서요.
2차원 배열 대용으로 vector를 써도 되는데, 다차원 배열에 가까운 형태로
Boost.MultiArray도 있습니다.
vector< vector<int> > a;
vector< vector<int> > a;
이런 방법도 있었군요;;
전 여태 백터의 배열로 만들어 썼습니다.
그런데 그렇게 쓰다가 문제가 생겼네요.
일단 이런식으로 만들어서 컴파일도 잘되서 실행을 해봤습니다.
보시다 시피 프로그램 마지막 부분에 결과를 콘솔로 출력하는 부분이 있습니다.
근데 출력 결과가 나오고 나서도 바로 끝나지 않고 프로그램이 한참 있다가 끝나는데요.
이상해서 구조체에 생성자와 소멸자를 넣어서 출력하게 해봤더니 생성자는 한번뜨는데 소멸자만 무지 많이 떠버리더군요.
이건 왜 그런걸까요? 백터를 배열로 쓴거 부터가 잘못인가요?ㅡㅡ;
vector의 배열을
vector의 배열을 쓴다고 해서 잘못이라고 할 수는 없지요.
배열을 다루는 일반 원칙을 그대로 적용하면 됩니다.
이 코드에 특별이 잘못된 부분은 보이지 않네요.
이상한 현상을 보인다면 다른 부분일 듯.
그리고 생성자와 소멸자의 호출 회수가 다르다고 하셨는데
혹시 복사생성자를 간과하신 것 아닌가요?
"모든" 생성자의 호출 회수와 소멸자의 호출 회수는 반드시
같아야 합니다.
복사생성자를 미처
복사생성자를 미처 생각을 못했네요^^;
근데 대입연산자와 복사생성자를 아래와 같이 만들어 줬는데도 소멸자가 무한적으로 호출되데요.
혹시 mst함수 인자로 vector의 포인터로 받을 때도 복사생성자가 호출되는건가요?
만약 그렇다면 그때 복사생성된 객체의 소멸은 언제 이루어 지는건가요?
그리고 생성자의 수와 소멸자의 수가 같아야 된다고 하셨는데 이때 생성자에 복사생성자의 수도 포함된거겠죠?
제가 대입연산정의나 복사생성자를 잘못 만든 것인지 아님 또 뭔가 빠트린게 있어서 그런건지 모르겠네요.
Quote:혹시 mst함수
포인터나 참조형 인자의 경우에는 복사생성자가 호출되지 않습니다.
복사되는 것은 포인터이지 vector가 아니니까요.
그리고 값으로 받은 경우에는 함수가 return 할 때 인자의 소멸자가 호출됩니다.
물론입니다.
소멸자가 무한하게 호출된다고요?
코드를 보면 전혀 잘못 될 것이 없는데요.
혹시 대입연산자의 인자를 참조형이 아니라 값으로 하신 것 아닌가요?
Edge& operator=(const Edge e);
이렇게 말이죠.
대입연산자는 앞에
대입연산자는 앞에 올렸듯이
Edge& operator=(const Edge& e);
참조형으로 정의 했구요.
복사생성자가 어디서 생기나 했더니 백터에 push_back()할때마다 생성되더군요.
뭐 그렇다 치더라도 그럼 소멸자가 무한으로 호출되는건 왜 일까요?
지금까지 구조체를 쓰면서 대입연산자나 복사생성자에 대한 정의는 안만들고 기본으로 정의된 것을 사용해도
잘 됬었는데 지금은 왜 이런 문제가 생기는지 의문입니다.
글쎄요. 코드를 보지
글쎄요. 코드를 보지 않고서는 알 수 없습니다.
void mst(vector<Edge> *adj,
벡터배열을 포인터로 받은 함수에서 erase()를 하는과정에서 문제가 있었나 봅니다.
왜 그런지는 잘몰라서 그냥 벡터배열을 전역변수로 돌렸더니 괜찮더군요.
아무튼 저의 우문에 답변해주신 doldori님께 감사드립니다.
댓글 달기