2016-09-27 2 views
0

나는 memcpy와 비슷한 기존 함수를 찾고 있는데, x 바이트를 복사 한 다음 y 바이트를 건너 뛰고 지정된 양이 복사 될 때까지 반복합니다.memcpy는 복사하는 동안 x 바이트를 건너 뛰는 것과 동일합니다 (초기 x 바이트가 아님)?

데이터가있는 버퍼가 있다고 가정하면 : AABAAB (문자를 사용했지만 조작중인 데이터는 문자열 데이터가 아닙니다).

이 버퍼에 적용되어 2 바이트를 복사하고 1 바이트를 건너 뛸 때 대상 버퍼에는 AAAA이 포함됩니다.

나는 STL과 부스트를 조사하는 것을 찾지 못했지만, 내가 놓친 것 중 하나가 있기를 바라고 있습니다.

또는 똑같은 것을 달성하기 위해 더 일반적인 기능을 사용하는 영리한 방법이 있습니다.

+4

나는 부스트 유저가 아니지만 'memcpy()'를 사용하여 루프를 작성하는 것은 간단하지 않을까요? 현대 C++에서 새로운 코드를 작성할 수 있습니까? :) – unwind

+0

어쩌면 당신은'std :: copy_if'를 사용할 수 있습니다 –

+0

나는 최적화 된, 테스트 된 기능을 활용할 수 있기를 바라고 있습니다. - 구현할 시간이별로 없어요. 하지만, 그것이 내가해야 할 일입니다. – grae22

답변

0

필자가 원하는대로 memcpy와 직접적으로 동일한 것으로 보이지 않습니다. Boost는 종종 유용한 도우미 기능을하는 것처럼 보입니다. 그러나 가장 단순한 것 같았던 것처럼 간단한 루핑 기능을 구현하는 데 끝이났습니다. & 적절한 해결책.

2

boost::adaptors::strided을 살펴볼 수 있습니다.

당신은 아마 이런 걸 쓸 줄이 조립을 많이 생산하고 있지만

boost::copy(boost::make_iterator_range(in, in+size) | boost::adaptors::strided(2), out); 

를, 또한 컴파일러에 의해 완벽하게 인라인 할 것 같다 : compiler explorer example.

당신은 또한 모든 n 번째 요소 ( strided 반대를 수행하고 매 n 번째 일 유지) 허용하지 술어로 boost::adaptors::filtered에 의존 수있는 모든 n 번째 요소를 제거하려면 다음

char const* input = "AABAAB"; 

unsigned counter{}; 
auto pred = [&counter](auto const&){ return ++counter % 3; }; 
boost::copy(boost::make_iterator_range(input, input+strlen(input)) | boost::adaptors::filtered(pred), 
      std::ostream_iterator<char>(cout)); 

live example을;

+0

고맙습니다. 유망 해 보입니다. 일반 데이터 배열이 아닌 STL 컨테이너 (예 : 벡터)에 데이터를 저장해야한다고 가정합니다. – grae22

+0

반복기 쌍으로 만든 모든 범위에서 작동해야한다고 생각합니다. 나는 예제로 업데이트 할 것이다. – krzaq

+0

@ grae22가 업데이트되었지만 문제의 해결책인지 또는 최선의 방법인지는 더 이상 확신 할 수 없습니다. – krzaq

관련 문제