Java ArrayList의 C ++ 버전은 무엇입니까?


답변:


88

표준 라이브러리 의 std::vector클래스 를 사용하십시오 .


3
흠 ... 다른 답변에서 벡터가 연결된 목록으로 구현되지 않은 것 같습니까? 내가 맞아? 이 목록을 추가 및 제거 된 개체의 상당히 높은 회전율을 갖는 컬렉션으로 사용하고 있습니다. 이 어레이가 실제로 최상의 구현입니까? 아니면 연결된 목록 버전이 있습니까?
interstar

5
@interstar-절대적으로 정확합니다. 연결 목록 의미 체계를 정말로 원한다면을 사용하십시오 std::list.하지만 인덱싱 가능성 (no operator[]) 을 잃어 버리 므로 실제로는 배열이 아닙니다. list그것은 vector종종 더 나은 선택 과 같은 고유 한 특성을 가지고 있습니다. 표준 C ++ 컨테이너에서는 어떤 방식 으로든 타협해야합니다. 좀 deque더 나은 성능을 제공 할 수 있습니다. 그것은의 (상대적으로) 쉽게 측정 할 vectordequelist가 코드에서 주로 상호 교환으로 - 당신의 컨테이너 예에 대한 형식 정의를 사용합니다 typedef vector<MyObj> MyList.
Steve Townsend

음, 먼저 벡터를 시도해 보겠습니다. 인덱스가 유용하기 때문입니다. 너무 느리면 연결된 목록으로 이동할 수 있습니다. 감사합니다
interstar

2
@interstar, ArrayList는 이름에서 짐작할 수 있듯이 연결 목록으로 구현되지 않습니다. 당신은 LinkedList. 또한 목록에서 추가 및 제거 된 개체의 회전율이 상당히 높 vector더라도 list처음에 다시 할당 할 필요가없는 충분한 공간을 할당하는 것보다 훨씬 빠를 수 있습니다 (예 : 필요한 최대 공간).
Kyle Strand

@KyleStrand 흥미 롭군요. 나는 항상 ArrayList가 "배열로 구현 된 것과 같은 연결 목록"이 아니라 "연결 목록으로 구현 된 배열과 같은 것"을 의미한다고 생각했습니다.
interstar

63

여기에서 몇 가지 추가 포인트를 다시 사용 vector합니다.

Java 와 달리 ArrayList, Arrayvector배열 로 취급하기 위해 특별한 작업을 수행 할 필요가 없습니다 . C ++의 기본 스토리지는 연속적이고 효율적으로 인덱싱 할 수 있습니다.

와 달리 ArrayLista vector는 완전한 객체로 캡슐화하지 않고 기본 유형을 효율적으로 보유 할 수 있습니다.

에서 항목을 제거 할 때 제거 vector된 항목 위의 항목을 아래로 이동하여 연속적인 저장 공간을 유지해야합니다. 이는 대형 컨테이너의 경우 비용이 많이들 수 있습니다.

vector복사 생성자와 할당 연산자가 효율적인에 복잡한 객체를 저장하는지 확인하십시오 . 내부적으로 C ++ STL은 컨테이너 하우스 키핑 중에이를 사용합니다.

reserve()나중에 확장 할 때 메모리 재 할당을 최소화하기 위해 스토리지를 사전에 (즉, 벡터 생성 또는 초기화시) Java에서 C ++로 전달하는 것에 대한 조언 .


6
더 나은 대답은 받아 들여 져야합니다.
Paul Rooney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.