크기를 조정하기 위해 배열에서 얕은 사본을 수행하는 의미는 무엇입니까?
-
10-07-2019 - |
문제
깊고 얕은 복사에 대한 나의 이해가 맞다면 내 질문은 불가능합니다. 배열 (A [10])가 있고 얕은 사본 (B [20])을 수행하는 경우 B의 데이터가 인접하지 않기 때문에 불가능하지 않습니까?
내가 이것을 완전히 잘못 이해했다면 누군가 (c#에서) C ++의 배열 크기를 조정하기 위해 재 할당을 수행하는 빠른 방법을 조언 할 수 있습니다.
노트
Im System.array 객체의 .clone () 및 .copy () 멤버를보고 있습니다.
해결책
기존 배열 크기를 조정할 수는 없지만 사용할 수 있습니다.
Array.Resize(ref arr, newSize);
이것은 새 배열을 할당하고 이전 배열의 데이터를 새 배열로 복사하고 업데이트합니다. arr
변수 (이 경우 REF로 전달됩니다). 이게 네가 말하는거야?
그러나 누구든지 다른 이전 배열에서 여전히 가리키는 참조는 업데이트되지 않습니다. 더 나은 옵션은 작업하는 것입니다 List<T>
-수동으로 크기를 조정할 필요가 없으며 오래된 참조 문제가 없습니다. 방금 Add
/Remove
등. 일반적으로 배열을 매우 자주 사용하는 경향이 없습니다. 그들은 그들의 용도를 가지고 있지만 기본 케이스는 아닙니다.
당신의 의견을 다시 말하십시오.
- 권투:
List<T>
상자가 아닙니다. 그것은 제네릭에 대한 요점 중 하나입니다. 후드,List<T>
주변의 포장지입니다T[]
, 그래서 aList<int>
있습니다int[]
- 복싱 없음. 나이가 많습니다ArrayList
주변의 포장지입니다object[]
, 하도록 하다 하다 상자; 물론 권투 당신이 가정 할 수있는 것만 큼 나쁘지 않습니다 그래도. - 작업
Array.Resize
;내가 기억한다면, 그것은 크기를 찾습니다실제 세부 사항은 내부 통화로 숨겨져 있지만 본질적으로 새 배열을 할당 한 후에는 두 배열 사이의 데이터의 블릿 (memcpy)이므로 매우 빠릅니다. 참조 유형의 경우 힙의 객체가 아니라 참조 만 복사합니다. 그러나 정기적으로 크기를 조정하는 경우T
, 그런 다음 사용합니다Buffer.BlockCopy
내용물을 블리팅합니다List<T>
일반적으로 훨씬 간단 할 것입니다 (기본적으로 재 구현하지 않는 한 더 빠릅니다.List<T>
크기를 최소화하기 위해 용량을 여분의 용량을 제공합니다).
제휴하지 않습니다 StackOverflow