我有这段代码,执行得非常糟糕,m_songs
我正在寻找一些优化。内部forloop是罪魁祸首,因为m_songs
随着时间的推移而增长,因为forloop循环遍历所有项目以检查缓存中是否有某些项目。我将如何更有效地重写它?
for(auto& const filename : filenames) {
auto alreadyInCache = false;
for(unsigned int i = 0; i < m_songs.size(); i++) {
if(filename == m_songs[i]->filename) {
alreadyInCache = true;
}
}
if(alreadyInCache) {
continue;
} else {
// add items to m_songs;
}
}
// Overwrite our cache with the latest m_songs
好吧我已更新我的代码以使用find_if()
在我正在执行此操作的文件名的forloop中:
auto it = std::find_if(m_songs.begin(), m_songs.end(), [filename](std::shared_ptr<Song> n) {
return n->filename == filename;
});
auto alreadyInCache = it != m_songs.end();
if(alreadyInCache) continue;
这会更有效率,还能进一步改善吗?
答案 0 :(得分:1)
如果m_songs
是一个已排序的vector
,我认为它看起来像是相同的代码正在填充它(// add items to m_songs
),那么您可以执行binary search使用std::lower_bound
而不是逐个元素地检查。
如果您尚未按顺序添加元素,请按以下步骤操作:how do you insert the value in a sorted vector?