AJG*_*G85 31 c++ optimization stl find
好的作为前言我需要缓存很少修改数据的相对较小的子集,以避免出于性能原因频繁查询数据库.这些数据大量用于只读意义,因为它通常由其他表中的更大数据集引用.
我编写了一个类,它能够在内存中基本上存储所讨论的两个表的全部内容,同时监听提交更改以及用于更新缓存对象的线程安全回调机制.
我当前的实现有两个std::vectors用于每个表的元素.该类提供两个访问每个矢量的整体以及方便的方法用于搜索通过表数据的特定元素std::find,std::find_if等.
有谁知道,如果使用std::list,std::set或者std::map在std::vector用于搜索将是可取的?大多数情况下,在建立新连接后从数据库填充一次后将要求这些容器.
我也愿意使用VS2010或Boost支持的C++ 0x功能.
R. *_*des 53
用于搜索一个特定的值,与std::set和std::map它需要为O(log n)的时间,而与其他两个花费O(N)时间; 所以,std::set或者std::map可能更好.由于您可以访问C++ 0x,因此您也可以使用std::unordered_set或std::unordered_map平均占用一段时间.
因为find_if它们之间没什么区别,因为它需要一个任意谓词,当然容器也不能随意优化.
但是,如果您find_if经常使用某个谓词进行调用,则可以自行优化:使用std::map或std::set使用自定义比较器或特殊键,然后使用find.
Mar*_*som 22
使用的排序向量std::lower_bound可以与std::set您不经常更新一样快; 他们都是O(log n).值得尝试看看哪种情况更适合您自己的情况.