C ++: Как мне написать функцию, которая принимает итератор и вставляет элементы? - PullRequest
1 голос
/ 11 сентября 2010
template<class Container>
void BlitSurface::ExtractFrames(Container & output, int frame_width, int frame_height,
                                         int frames_per_row, int frames_per_column,
                                         bool padding) const
{
    SDL_Surface ** temp_surf = SDL_Ex_ExtractFrames(_surface, frame_width, frame_height, frames_per_row, frames_per_column, padding);

    int surface_count = frames_per_row * frames_per_column;

    output.resize(surface_count);
    Container::iterator iter = output.begin();

    for(int i=0; i<surface_count; ++i, ++iter)
        iter->_surface = temp_surf[i];

    delete [] temp_surf;
}

У меня эта функция разбивает изображение на фреймы и сохраняет их в контейнере изображений. Как бы я изменил его, чтобы взять итератор вместо контейнера и вставить элементы в этой точке?

1 Ответ

4 голосов
/ 11 сентября 2010

Использование back_inserter:

template<typename OutputIterator>
void BlitSurface::ExtractFrames(OutputIterator it, int frame_width, int frame_height,
                                         int frames_per_row, int frames_per_column,
                                         bool padding) const
{
    /* ... other lines unchanged ...*/
    for(int i=0; i<surface_count; ++i) {
        // "BlitSurface()" sets other members to zero. Alternatively you
        // can use boost::value_initialized for that. 
        BlitSurface bs = BlitSurface();
        bs._surface = temp_surf[i];
        *it++ = bs;
    }
    delete [] temp_surf;
}

Тогда назовите это как

ExtractFrames(std::back_inserter(container), ...);
...