2017-03-19 2 views

답변

3

방금 ​​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까지 확장 할 때 사용됩니다.

+0

그러므로 assets.begin()은 assets.end()와 같습니다. 누락 된 부분입니다. 고맙습니다! – Daenyth

0

std::transform()은 출력에 직접 쓸 수 있다고 가정합니다. 귀하의 경우에는 크기가 0 인 벡터입니다. 벡터를 변환 입력 크기로 명시 적으로 크기를 조정하거나 이미 발견 한대로 back_inserter을 사용하여 버그를 수정할 수 있습니다.

0

assets의 크기를 rawAssets과 같은 크기로 transform보다 작게 설정하면 잘못된 액세스가 발생하지 않습니다. back_insert_iterator을 사용하면 transform의 각 반복자에 대해 push_back이 호출됩니다. 그것없이, 그것은 여전히 ​​비어있는, 따라서 나쁜 접근을 야기하는 assets의 첫번째, 두번째, 세번째, etc 요소에 접근하려고 시도합니다.

1

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()가 미리 크기 조정 배열의 내용을 작성 끝,

  1. begin() 반복자를 취득하기 전에, resize() 당신이 transform()에 대해있어 요소의 수와 벡터 :

    당신은 두 가지 기본 옵션이 있습니다 , 정확하게. 그러나 데이터가 목록에서 제공되므로 다음을 쉽게 사용할 수 없습니다.

  2. 반복자 대신 빈 배열에 std::back_insert_iterator ~ transform()을 전달합니다.

관련 문제