C ++ 벡터에 해당하는 C #은 무엇입니까?
이 기능을 찾고 있습니다.
표준 배열에 비해 액세스 성능 저하가없는 연속적으로 저장된 메모리의 동적 배열을 갖기 위해.
나는 찾고 있었고 그들은 이렇게 말합니다 .NET equivalent to the vector in C++ is the ArrayList
.
ArrayList에 연속 메모리 기능이 있습니까?
답변:
당신은을 사용할 수 있습니다 List<T>
때 T
경우 경우가 아닐 것은 연속적인 메모리에 할당 될 값 타입 T
참조 타입이다.
예:
List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);
int someElement = integers[1];
List<T>
클래스 문서 에는 많은 예제가 포함되어 있지만 대답을 업데이트하여 하나를 포함했습니다.
T
참조 유형 이더라도 연속적인 메모리를 보유하게 될 것입니다. 그것은 ... 기본적으로 포인터의 배열입니다
T[]
OP는 "액세스 대 표준 어레이에 대한 성능 저하 없음"을 요구했으며이를 List<T>
제공합니다. T
참조 유형 인 경우 T*
C ++에서와 유사 하므로 C ++에서만큼 연속성을 얻습니다. 객체 자체가 연속적이기를 원한다면 물론 두 언어 모두에서 값 유형이 필요합니다. 물론 차이점은 C ++에서는 모든 유형이 값 또는 참조로 사용될 수있는 반면, C #에서는 클래스 / 구조체 구분을 통한 유형의 속성이라는 것입니다.
List<T>
항상 내부적으로 연결된 목록으로 구현 되었다고 생각했습니다 . 그렇다면 우리가 호출하면 어떻게 동적으로 확장 Add()
됩니까? Redim Preserve
전체 어레이를 새 위치로 복사하는 데 사용되는 VB6과 같은 것 입니까?
List<T>
으로 작은 배열을 만듭니다 T[]
. 항목은 내부적으로 배열에 추가됩니다. 배열의 크기가 완료되면 이전 배열의 두 배 크기로 새 배열이 생성됩니다. 데이터는 더 큰 새 어레이로 복사되고 더 작은 어레이는 파괴됩니다. 개발자는 List
via 생성자 를 채우기 전에 충분히 큰 내부 배열을 만들기 위해 .NET에 힌트를 줄 수 있습니다 new List<T>(expected_array_size)
.
를 사용하십시오 List<T>
. 내부적으로 그것은 배열을 사용하고 배열은 연속적인 메모리를 사용합니다.
private T[] _items;
백엔드 저장소, 참조 유형에 사용 되는지 여부가 있습니다 .
곧 CLR / C #에서 Vector <>에 대한 더 나은 지원이 제공 될 것 같습니다.