列表中的性能过滤

时间:2018-06-04 20:51:12

标签: c++ performance list optimization

我有这段代码,执行得非常糟糕,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;

这会更有效率,还能进一步改善吗?

1 个答案:

答案 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?