2009-06-03 5 views
1

저는 intro C++ 숙제에서 일하고 있지만 막혔습니다.C++ 클래스 인스턴스

Account *GetAccount(int an); 

int main() 
{ 
Account *a1,*a2,*b1; 
a1=GetAccount(123); 
a2=GetAccount(456); 
b1=GetAccount(123); 
if(a1==b1) 
    cout<<"YES"<<endl; 
else 
    cout<<"NO"<<endl; 

GetAccount 방법은 인스턴스가 이미 않는 경우, 해당 인스턴스를 반환 동일한 계정 번호가 존재하는지 여부를 확인하기로되어있다.

내가 생각할 수있는 유일한 방법은 계정 배열을 만들고 계정을 검색 한 다음 존재하지 않는 경우 배열에 새 계정을 삽입하는 것입니다. 포인터가 있으면 포인터를 배열에 반환합니다.

이 방법은 실제로 나에게 효율적으로 보이지 않으며 다른 방법이 있습니까?

+0

예. 그것을 확인하는 가장 효율적인 방법은 배열이지만 인스턴스를 반환하기 때문에 포인터 공간이 필요합니다. 500 개의 계정을 가질 계획이라면 500x4 바이트 = 2000 바이트 또는 1.95kb가됩니다. 물론 32 비트 포인터. 일반적인 조회는 다음과 같습니다. 계정 * GetAccount (int an) { return accountsArray [an]; } AccountsArray는 컴파일 타임 또는 동적 메모리에서 만든 정적 배열 일 수 있습니다. 물론 다른 솔루션도 매우 좋습니다. 지도 나 벡터를 사용하는 것이 좋습니다. – toto

답변

1

간단한 배열 대신 std::map을 사용할 수 있습니다.

2

hash tables을 고려하십시오.

+2

당신이하고있는 일의 의미에 맞는 적절한 데이터 구조를 선택하는 것이 내 마음에 너무 조숙 한 최적화의 범위에 속하지 않습니다. 그것은 디자인의 일부입니다. 올바른 접근법을 사용하거나 의미 론적으로 원하는 것과 일치하는 것으로 시작하면 이후의 모든 리팩토링이 더 쉬워 질 것입니다. 크 누스 (Knuth)는 명백한 나쁜 디자인 선택을 고치지 않고 "작은 효율성"에 대해 경고했다. – Rob

+0

오른쪽 게시물, 수정 된 게시물. 당신의 의견에 감사드립니다. –

0

계정 # => 계정 개체의 std :: map을 만듭니다.

8

예. 배열 대신 맵을 사용하십시오. 그것은 공간 측면에서, 그리고 거의 빠른 속도로 더 효율적입니다.

당신은 STL을 사용하고 표준 : 맵에 계정을 유지할 수 있습니다, 이러한 변형 중 하나를 첫 번째 경우에

map<int, Account> or 
map<int, Account*> 

, 당신은 두 번째에 당신이 계속지도에 계정을 유지 Accounts에 대한 포인터이며 생성/삭제를 담당합니다. 어떤 대안이 더 적절합니까? 계정을 만들거나 초기화하는 방법에 따라 다릅니다. STL 맵 사용

당신은지도에있는 포인터를 지킬 때 나는 사건을 exlain됩니다에


짧은 튜토리얼.

당신이지도를 선언 할 방법은 다음과 같습니다

map<int, Account*> accounts; 

이것은 당신이지도에 새 계정을 추가 할 수있는 방법입니다 :

int account_id = 123; // or anything else 

Account* account = new Account(...paramters for the constructor...) 
// any additional code to initialize the account goes here 

accounts[account_id] = account; // this adds account to the map 

이것은 당신이 확인하는 방법입니다 경우 ACCOUNT_ID와 계정 는 다음과 같습니다 :

if (accounts.find(account_id) != accounts.end()) { 
    // It is in the map 
} else { 
    // it is not in the map 
} 

지도에서 계정에 대한 포인터를 얻는 방법입니다.

Account* ifoundit = accounts[account_id]; 

마지막으로 프로그램 끝 부분에서지도를 지우고 모든 계정 개체를 삭제해야합니다. 이 프로그램은 정리 작업을하지 않아도 제대로 작동하지만 중요한 것은 정리해야합니다. 나는 이것을 당신을위한 연습으로 남겨 둡니다 : 지도의 모든 요소를 ​​반복하고 삭제를 적절하게 적용하는 방법을 찾으십시오.

+0

저는 C++에서 매우 새롭고 map에 대한 사용법을 검색하고 있습니다. 대부분의 페이지는 이해하기가 어렵고 객체와 맵에 대해 실제로 이야기하지 않습니다. 내가 볼 수있는 소스가 있습니까? –

+0

에는 기본적인 삽입 및 제거를위한 삽입 및 삭제 방법이 있습니다. 인덱스 구문 (myMap [ "key"] = 12)을 사용할 수도 있지만, 존재하지 않으면 항목을 작성한다는 경고를받습니다. 모든 STL 컨테이너와 마찬가지로 반복기의 개념에 익숙해 져야합니다. STL을 사용하려고한다면 Josuttis 참조 자료를 살펴 보는 것이 좋습니다. 객체 사용법에 관해서는지도에 삽입하면 저장하는 모든 유형의 사본을 만들 수 있다는 점에 유의하십시오. 포인터를 저장하는 경우에는 포인터 만 복사하면됩니다. –

+0

정말 유용한 자습서가 없습니다. STL지도. 잠시 후에 내 대답을 업데이트하여 STL 맵을 사용하는 방법을 설명합니다. –

2

이 방법은 실제로 나에게 효율적으로 보이지 않으며 다른 방법이 있습니까?

예, 다른 언급했듯이 배열 이외의 다른 데이터 구조를 사용하는 것이 더 효율적입니다. 최근에 수업에서 배열과 루프를 공부 해왔다면, 설명하는 방법이 강사가 기대하는 것일 수도 있습니다. 너무 멀리 당신의 강사 앞서 도착하려고하지 않을거야 배열 및 루프 메서드는 아마도 당신이 당신의 시험에 응할 때 매우 익숙해야 할 일종의이기 때문에. 앞으로 나아 가기 전에 기본에 대한 강력한 토대를 마련하는 것도 좋은 생각입니다. 그래도 여기에 더 많은 고급 질문을하지 못하게하십시오.

1

제안한 방법, 걸으면서 테스트하는 ID 배열은 매우 쉽습니다. 나는 std :: vector를 사용 하겠지만 배열은 아니다. 크기에 대해 걱정할 필요가 없기 때문이다. 그렇지 않으면 큰 배열을 선언하고 추가 할 때 전체 배열이 아닌지 테스트합니다.

효율성 측면에서 볼 때 작은 배열 (수백 가지)에 대한 선형 검색을 수행하는 것은 매우 빠르며지도 및 세트와 같은 다른 솔루션보다 훨씬 빠릅니다. 그러나, 그것은 잘 확장되지 않습니다.

코드를 잘 작성해보십시오. 그러나 프로브를 가지고 있다는 것을 알기 전까지는 코드를 최적화하는 것에 대해 걱정하지 마십시오. 필자는 프로그래머가 최적의 속도보다 청결하고 유지하기 쉬운 코드를 작성하는 편이 낫다. 우리가 필요하다면 우리는 나중에 일을 늦출 수 있습니다.

관련 문제