변환.는 :: 나는 CPP 응용 프로그램에서이 코드를 (대략)이 원인 EXC_BAD_ACCESS
그러나 assets.begin()
을 std::back_inserter(assets)
으로 변경하면 예상대로 작동합니다.
std::transform
에 대한 사용법을 모두 보여주는 자습서가 있습니다. 내 경우에 왜 틀린거야?
변환.는 :: 나는 CPP 응용 프로그램에서이 코드를 (대략)이 원인 EXC_BAD_ACCESS
그러나 assets.begin()
을 std::back_inserter(assets)
으로 변경하면 예상대로 작동합니다.
std::transform
에 대한 사용법을 모두 보여주는 자습서가 있습니다. 내 경우에 왜 틀린거야?
방금 QVector<std::pair<QString, QString>> assets
으로 선언 했으므로 이 비어 있습니다.assets.begin()
은 따라서 assets.end()
과 같으며 빈 벡터의 끝을 가리 킵니다.
std::transform
세번째 파라미터는 transform
변환의 결과 물품 (각각 기록 후가 증가)되는 것이다 반복기이다.
assets.begin()
을 전달하면 transform
은이 과거의 이터레이터를 통해 쓰여지고 결과적으로 범위를 벗어난 쓰기가 발생합니다.그것은 있도록 약 char x[3]; x[4] = 'a';
당신이 std::back_inserter(assets)
에 통과하면, 당신은 특별한 반복자를 만드는 일을 같은입니다 assets
에 그것을 통해 실제로 삽입 서면 요소를 작성. 그래서 모든 것이 잘됩니다. assets
이미 충분한 크기의라면
첫 번째 형태는 사용될 수있다, 당신은 그것에 요소를 덮어 를 원했다. 두 번째 형식은 을 변환 할 때assets
까지 확장 할 때 사용됩니다.
std::transform()
은 출력에 직접 쓸 수 있다고 가정합니다. 귀하의 경우에는 크기가 0 인 벡터입니다. 벡터를 변환 입력 크기로 명시 적으로 크기를 조정하거나 이미 발견 한대로 back_inserter
을 사용하여 버그를 수정할 수 있습니다.
assets
의 크기를 rawAssets
과 같은 크기로 transform
보다 작게 설정하면 잘못된 액세스가 발생하지 않습니다. back_insert_iterator
을 사용하면 transform
의 각 반복자에 대해 push_back
이 호출됩니다. 그것없이, 그것은 여전히 비어있는, 따라서 나쁜 접근을 야기하는 assets
의 첫번째, 두번째, 세번째, etc 요소에 접근하려고 시도합니다.
assets
은 빈 벡터로 시작합니다.
transform()
의 세 번째 매개 변수는 출력 반복기입니다. 코드는 다음과 본질적으로 동일합니다 : 어떻게 transform()
작품
QVector<std::pair<QString, QString>> assets;
auto output_iter=assets.begin();
// You now call transform(), passing output_iter
//
// transform() then essentially does the following:
*output_iter++ = /* first transform()ed value */;
*output_iter++ = /* second transform()ed value */;
// ... and so on.
있다고. assets()
은 빈 벡터이므로 begin()
은 종료 반복자 값을 제공하고 코드는 계속해서 벡터의 끝을 깨끗하게 작성하고 그 자체를 쓰레기 처리합니다. 그래서 transform()
가 미리 크기 조정 배열의 내용을 작성 끝,
begin()
반복자를 취득하기 전에, resize()
당신이 transform()
에 대해있어 요소의 수와 벡터 :
당신은 두 가지 기본 옵션이 있습니다 , 정확하게. 그러나 데이터가 목록에서 제공되므로 다음을 쉽게 사용할 수 없습니다.
반복자 대신 빈 배열에 std::back_insert_iterator ~ transform()
을 전달합니다.
그러므로 assets.begin()은 assets.end()와 같습니다. 누락 된 부분입니다. 고맙습니다! – Daenyth