对于电影的每一帧,我都有一个音频元素队列。我想将它们从最后一次看到到第一次看到最多删除一定数量的元素。我使用 timeval 来确定时间值。由于对元素调用擦除,我遇到了迭代器问题。
我尝试创建一个 std::multimap 来存储基于 timeval 键的所有迭代器。然后我将所有迭代器存储在一个基于 max_frames 的向量上以删除。然后我将迭代器的向量从大到小排序。然后擦除所有迭代器。
// C++
void CMedia::timed_limit_audio_store(const int64_t frame)
{
unsigned max_frames = max_audio_frames();
struct customMore {
inline bool operator()( const timeval& a,
const timeval& b ) const
{
return (((a).tv_sec == (b).tv_sec) ?
((a).tv_usec > (b).tv_usec) :
(a).tv_sec > (b).tv_sec)));
}
};
typedef std::multimap< timeval, audio_cache_t::iterator,
customMore > TimedSeqMap;
TimedSeqMap tmp;
{
audio_cache_t::iterator it = _audio.begin();
audio_cache_t::iterator end = _audio.end();
for ( ; it != end; ++it )
{
if ( (*it)->frame() - max_frames < frame )
tmp.insert( std::make_pair( (*it)->ptime(), it ) );
}
}
unsigned count = 0;
TimedSeqMap::iterator it = tmp.begin();
typedef std::vector< audio_cache_t::iterator > IteratorList;
IteratorList iters;
for ( ; it != tmp.end(); ++it )
{
++count;
if ( count > max_frames )
{
// Store this iterator to remove it later
iters.push_back( it->second );
}
}
IteratorList::iterator i = iters.begin();
IteratorList::iterator e = iters.end();
// We sort the iterators from bigger to smaller to avoid erase
// trashing our iterator. However, this is not working properly.
std::sort( i, e, std::greater<audio_cache_t::iterator>() );
i = iters.begin();
e = iters.end();
for ( ; i != e; ++i )
{
_audio.erase( *i );
}
}
预期的结果是向量的元素根据音频元素的时间值被移除。实际的错误是内存垃圾,有时会崩溃。