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
{
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;
for(int i=0; i<surface_count; ++i)
{
BlitSurface bs;
bs._surface = temp_surf[i];
*it = bs;
++it;
}
delete [] temp_surf;
}
我有這個函數,它工作正常。唯一的問題是我不想調用複製構造函數,因爲它複製整個表面,我只需要複製指針。我只是想使用默認的構造函數,然後設置成員_surface到temp_surface [I],如:如何避免使用插入迭代器調用複製構造函數
for(int i=0; i<surface_count; ++i)
{
it->_surface = temp_surf[i];
++it;
}
,對於正常的迭代器的工作原理,而不是插入迭代器。我如何解決它對兩者都有效?
標準'insert_iterator'適配器被定義爲調用一些容器的'insert',這反過來,被定義爲使用拷貝構造函數 - 督察,'insert_iterator' _must_使用拷貝構造函數,每標準。所以你需要定義一個不同的適配器來減少複製的數量(如果你想使用底層容器的'insert',你可能仍然需要複製構造至少一個新構造的默認構造的項目,方法!)。 – 2010-09-12 04:31:37
@Alex - 我有一個想法,但我不知道該怎麼做。我可以創建一個默認對象(_surface = NULL)。然後將其添加到容器中。在這種情況下,複製構造函數只會將_surface設置爲NULL。然後,在事實之後,我可以將對象的成員設置在容器中。但是,我再也無法使用插入迭代器了。你會知道該怎麼做嗎? – 2010-09-12 04:46:36
@user,'insert_iterator'適配器的標準實現增加了'operator ='中的插入指針,所以再一次,你不能用這個特定的適配器來實現**:你需要實現_your own_專業迭代器適配器。 – 2010-09-12 04:50:34