하나의 API에서 NSData *를 가지고 있고이를 다른 API의 std :: vector로 변환해야한다면, 복사하지 않고 안전하게이 작업을 수행 할 수있는 방법이 있습니까? NSData의 바이트 (매우 큰 NSData * 가정)?NSData * to std :: vector <부호없는 char> 복사하지 않고
6
A
답변
4
마음에 떠오르는 빠른 해결책이 없습니다.
(다른 API에서 반환하는 것이 아니라) NSData 객체를 만드는 경우 실제로 복사를 피할 필요가있을 때 NSData
및/또는 NSMutableData
의 하위 클래스를 고려할 수 있습니다. 그러면 저장소에 액세스 할 수 있습니다 (std :: 벡터).
또한 '당신'할당과 데이터를 생성하여 어떤 경우에는 주위에 몰래 할 수 있습니다 : 물론
NSData * data([[NSData alloc]
initWithBytesNoCopy:vector.data()
length:vector.size()
freeWhenDone:false]);
을, 당신은 벡터 크기를 조정 (또는 백업되지 않았는지 확인해야합니다 저장소가 다시 할당 됨). NSData
개체가 할당 해제됩니다.
경우에 따라 std::vector
이 아닌 매개 변수 유형을 변경하는 것도 고려해야합니다. 다른 컬렉션 유형을 수용하면서 NSData
멤버 및 벡터와 같은 인터페이스, 반복자 또는 begin + end를 갖는 작은 컨테이너가 적합 할 수 있습니다.
1
내가 STL 또는 CPP에 대해 충분히 모르겠지만, 당신은 빈 공간에서 벡터를 구성 할 수있는 경우 * 버퍼가 당신과 함께 할 수 있어야한다 : 데이터가를 소유
void * buffer = [data bytes];
size_t len = [data length];
염두에 두어야 버퍼 그래서 당신은 그것을 무료로하지 않을 수 있습니다.
관련 문제
- 1. itdate std :: vector <std :: vector <char>>?
- 2. Std :: Vector <struct> to const std :: vector <const struct> *
- 3. 'std :: vector <std :: basic_string <char>> *'에서 'const std :: vector <std :: basic_string <char>'& '
- 4. std :: vector <std :: reference_wrapper >
- 5. std :: vector <std::string> 충돌
- 6. 연속 된 부호없는 정수 목록을 사용하여 std :: vector <부호없는 int> 초기화
- 7. 복사하지 않고 벡터에 valarray 변환
- 8. 변환하는 방법 Rcpp :: List to std :: vector <double>
- 9. std :: vector <double> shrink to fit?
- 10. 복사하지 않고 파일에 std :: ostringstream을 쓰고 싶습니까?
- 11. 잘못된 std :: vector 생성자
- 12. std :: vector <std :: vector <float>>을 float으로 변환 **
- 13. 복사하지 않고 std :: string에서 스트리밍 하시겠습니까?
- 14. 복사하지 않고 std :: stringstream의 길이를 얻는 방법
- 15. std :: vector vs std :: insert
- 16. std :: vector <std :: pair <T,U>>
- 17. std :: unique() 사용하여 std :: vector <std :: unordered_set >
- 18. std :: sort on std :: vector <std::string>
- 19. 타입 'std :: vector <Object*> &'
- 20. std :: vector "cast"하는 방법 <char> std :: vector <wchar_t>
- 21. std :: vector after std :: bad_alloc
- 22. std :: vector <std :: pair <std :: string, bool >>을 문자열로 정렬 하시겠습니까?
- 23. C++ 기존 인스턴스를 복사하지 않고 std :: list :: push_back
- 24. Stack std :: vector scope
- 25. std :: vector (matlab) isempty :: vector (C++)
- 26. Igraph에서 std :: vector 사용
- 27. std :: vector 주위의 래퍼 생성자
- 28. NSData to NSString to åöä
- 29. std :: std :: string과 std :: vector 사이의 이동
- 30. Emacs : 텍스트를 복사하지 않고 (복사하지 않고)
이 작업을 수행하는 사용자 정의 할당 자 ('std :: vector'의 두 번째 템플릿 매개 변수)를 생성 할 수도 있지만,이 작업을 수행 할 수있는 out-of-the-box는 없다고 생각합니다 . –